从JSON解析循环对象

时间:2015-01-08 18:26:16

标签: javascript json cyclic

我有一个来自循环对象的这个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函数内部,除非你的键和值,否则不知道如何访问当前对象。

1 个答案:

答案 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;
 }