我有一个来自循环对象的这个json字符串。
[
{
"uid":"@Person:1",
"className":"Person",
"name":"James",
"age":21,
"contacts":["@Person:1","@Person:2"],
"id":1
},
{
"uid":"@Person:2",
"className":"Person",
"name":"James",
"age":45,
"contacts":["@Person:1"],
"id":2
}
]
uid 就像哈希码
我的目的是编写一个函数,使用JSON.parse在一个真实的循环javascript对象中转换这个JSON字符串,并使用reviver选项存储一个参考映射。
但我不知道,因为在reviver函数内部,除非你的键和值,否则不知道如何访问当前对象。
答案 0 :(得分:0)
您可以使用JSON reviver为对象映射构建ID并标识对象引用。然后,在复活之后,您可以重写引用的属性以指向引用对象。
// A heuristic to identify references that appear as string property values.
function looksLikeUid(s) { return typeof s === 'string' && /^@/.test(s); }
function parseCyclicJSon(myJSON) {
var uidToReferent = {};
var refs = [];
var cyclicObject = JSON.parse(
myJSON,
function (key, value) {
if (key === 'uid') {
// If this has a uid, store it for later retrieval.
uidToReferent[value] = this;
} else if (looksLikeUid(value)) {
refs.push(this, key); // Store reference for later resolution.
}
return value;
});
// Resolve references.
for (var i = 0; i < refs.length; i += 2) {
var o = refs[i], k = refs[i + 1];
o[k] = uidToReferent[o[k]];
}
return cyclicObject;
}