JSON.retrocycle只转换一些引用

时间:2011-08-12 15:48:11

标签: javascript ajax json

我有一个对象数组,其中一些对象中包含循环引用。所以我在通过JSON和JSON.retrocycle在另一端发送对象时使用了JSON.decycle。

这样的事情:

var refactor_data = JSON.retrocycle(JSON.parse(event.data));

问题是'refactor_data'中的一些项目已经转换了JSONPath引用,而其他没有,我无法弄清楚原因。

对象相当大,但如果需要,我会尝试提供样本。

编辑:
以下是OK对象的示例:http://pastebin.com/1hZDCipn
这是一个破碎物体的样本:http://pastebin.com/PfYCkrGt

EDIT2: 我认为那些具有参考'被替换'的实际上是原件而且retrocycle实际上对它们中的任何一个都没有做任何事情。这可能是因为它们在对象结构中太“深”了吗?

EDIT3:我试图在FireBug中运行后循环运行的评估:(我觉得这样做不正常)

EDIT4:我在JSON.retrocycle函数中添加了一个console.log,eval()返回了正确的对象,但返回的JSON和原始JSON没有改变。

感谢。

1 个答案:

答案 0 :(得分:3)

JSON-js cycle.js retrocycle function不希望路径的数组索引大于9.

一个未被重新循环的示例路径是:

$[11]["LegList"][0]["ItenaryList"][0]["Ar"]

一个类似的路径确实是逆行循环的:

$[9]["LegList"][0]["ItenaryList"][0]["Ar"]

如果查看cycle.js代码,您将看到为了使路径循环,它必须针对正则表达式进行验证。

// [...] A PATH is expected to be
// reasonably short. A PATH is allowed to belong to a very restricted subset of
// Goessner's JSONPath.

// So,
// var s = '[{"$ref":"$"}]';
// return JSON.retrocycle(JSON.parse(s));
// produces an array containing a single element which is the array itself.

var px =
    /^\$(?:\[(?:\d?|\"(?:[^\\\"\u0000-\u001f]|\\([\\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*\")\])*$/;

在px正则表达式中,只允许一个数字数组索引,而不是两个。
由于路径与模式不匹配,因此不会替换参考。

您可以尝试使用cycle.js的本地副本并将px正则表达式更改为:

var px = /^\$(?:\[(?:\d+|\"(?:[^\\\"\u0000-\u001f]|\\([\\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*\")\])*$/;

注意与前一个正则表达式的区别:我们说现在我们将允许数组索引中的一个或多个数字。这是通过更换单个?第一个d之后带有+的字符。

编辑: cycle.js retrocycle函数的较新版本现在允许大于9的数组索引。