我有一个对象数组,其中一些对象中包含循环引用。所以我在通过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没有改变。
感谢。
答案 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的数组索引。