我有一个对象数组,其中一些对象中有循环引用。所以我在通过 JSON 发送对象时使用 JSON.decycle,在另一端使用 JSON.retrocycle。
是这样的:
var refactor_data = JSON.retrocycle(JSON.parse(event.data));
问题是“refactor_data”中的某些对象已转换 JSONPath 引用,而其他对象则没有,我不明白为什么。
对象相当大,但如果需要,我会尝试提供示例。
编辑:
这是一个 OK 对象的示例:http://pastebin.com/1hZDCipn
这是一个 splinter 物体的样本:http://pastebin.com/PfYCkrGt
编辑2: 我认为那些引用“被替换”的实际上是原件,而 retrocycle 实际上对它们没有任何作用。这可能是因为它们在对象结构中太“深”了吗?
EDIT3:我尝试在 FireBug 中运行 retrocycle 应该运行的 eval:(我认为这不起作用是正常的)
EDIT4:我在 JSON.retrocycle 函数中添加了一个 console.log,eval() 返回正确的对象,但返回的 JSON 和原始 JSON 没有改变。
谢谢。
最佳答案
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 的数组索引。
关于javascript - JSON.retrocycle 只转换部分引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042734/