Javascript JSON.retrocycle只转换一些引用

Javascript JSON.retrocycle只转换一些引用,javascript,ajax,json,Javascript,Ajax,Json,我有一个对象数组,其中一些对象中有循环引用。因此,我在通过JSON发送对象时使用了JSON.decycle,在另一端使用了JSON.retrocycle 大概是这样的: var refactor_data = JSON.retrocycle(JSON.parse(event.data)); 问题是“refactor_data”中的一些项目转换了JSONPath引用,而另一些项目没有,我不知道为什么 对象相当大,但如果需要,我将尝试提供一个样本 编辑: 下面是一个OK对象的示例: 这是一个破碎物

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

大概是这样的:

var refactor_data = JSON.retrocycle(JSON.parse(event.data));
问题是“refactor_data”中的一些项目转换了JSONPath引用,而另一些项目没有,我不知道为什么

对象相当大,但如果需要,我将尝试提供一个样本

编辑:
下面是一个OK对象的示例:
这是一个破碎物体的样本:

编辑2: 我认为那些被“替换”的参考文献实际上是原件,而retrocycle实际上对它们都没有任何作用。这可能是因为它们在对象结构中太“深”了吗

EDIT3:我试着在FireBug中运行retrocycle应该运行的评估:(我认为这不起作用是正常的)

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

谢谢。

不希望路径的数组索引大于9

未被反向循环的一个示例路径是:

$[11]["LegList"][0]["ItenaryList"][0]["Ar"]
$[9]["LegList"][0]["ItenaryList"][0]["Ar"]
一个类似的路径确实得到了逆转:

$[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后面的字符,带a+


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

您在编辑中发布了正确的示例吗?我觉得这不像Javascript。你能用更标准的格式发布数据吗?JSON是递归工作的,所以不管元素有多深都不重要。这是我在PHP中JSON_decode()之后得到的输出,但与我在Firebug中得到的结果相同。至于更标准的格式,您有什么想法?能否在追溯之前显示一个坏的decycled event.data对象的示例?它几乎就是第二个示例()中的数据,其中$ref仍然存在:“$[11][“LegList”][0][“ItenaryList”][0][“Ar”]”。除了从PHP输出它之外,我想不出一种优雅的方式来向您展示一个示例。我尝试了一下,它是这么说的:无效的正则表达式:/^\$(?:[(?:\d+?)\”(?:[^\\“\u0000-\u001f]。([\\”/bfnrt]| u[0-9a-zA-Z]{4}]))$/:Unmatched')@Brayn抱歉,我建议的正则表达式缺少几个字符,因为我没有将其格式化为代码块。它与现有的正则表达式相同,只是在d后面插入了a+。我已经编辑了我的答案。耶,好像已经编辑好了。请你再详细地告诉我到底是什么问题好吗?永远感谢你,我在任何地方都找不到答案!