javascript - JSON.retrocycle 只转换部分引用

标签 javascript ajax json

我有一个对象数组,其中一些对象中有循环引用。所以我在通过 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/

相关文章:

jquery - fullcalendar-无法缓存 AJAX 调用的 JSON 响应

javascript - 使用 Ajax、JavaScript 和 HTML 发布一些数据

Javascript导出本地存储

javascript - 使用 getJSON 从 JSON 获取所有项目

javascript - selectize js中旧数据不替换为新数据

javascript - Node.js - 通过请求从 Google Drive 下载文件

javascript - 让 SoundJS 与 Cordova/Phonegap 一起工作

javascript - 以逗号分隔的双向绑定(bind)字符串

javascript - JS中如何更新变量

javascript - JSON 无法正确加载