JavaScript / GSON:通过对象图动态访问JSON引用(循环引用)

时间:2014-04-01 05:59:29

标签: javascript json serialization gson circular-reference

由于有几个循环引用,我有问题,要通过Google GSON序列化我的Java对象。我的所有尝试都以StackOverflowException结束,因为GSON无法处理这些循环引用。

作为解决方案,我找到了以下GraphAdapterBuilder

http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java?r=1170

实施例: https://groups.google.com/forum/#!topic/google-gson/z2Ax5T1kb2M

{
  "0x1": {
    "name": "Google",
    "employees": [
      "0x2",
      "0x3"
    ]
  },
  "0x2": {
    "name": "Jesse",
    "company": "0x1"
  },
  "0x3": {
    "name": "Joel",
    "company": "0x1"
  }
}

这非常有效,但我仍然无法在对象图上动态访问参考值(0xn),如:

alert(0x3.company.name); - >应打印" Google",但我只收到undefined

是否有可能实现这一目标?

也许使用自定义JSON.parse(ajaxResponse, function(key,value) {}函数将变量替换为引用的对象树?

2 个答案:

答案 0 :(得分:0)

<强> !!更新,更好的解决方案!!

如果您可以切换库,只需使用FlexJson&gt;&gt;&gt; http://flexjson.sourceforge.net/


我用自己的JSON解析器解决了我的问题:

原始"ref"

中的

"0x[n]"GraphAdapterBuilder

来源:

$.ajax({
    type: "POST",
    url: "controller/ajaxmethod.htm",
    data: { "var1": var1, "var2":var2},
    success: function(response){
    var jsonObject = parseGraphGSON(response, 0);
            ...
    },
    error: function(e){
          alert('Error: ' + e.status);
    }
});


function parseGraphGSON(gsonResponse, recursionLevel) {
    var maxRecursionDepth = 2;
    var jsonObject = JSON.parse(gsonResponse, function(key, value) {
        if (typeof value === 'string') {
            if (value.indexOf("ref") == 0) {
                if (recursionLevel < maxRecursionDepth) {
                    return parseGraphGSON(gsonResponse, recursionLevel + 1)[value];
                } else {
                    return JSON.parse(gsonResponse)[value];
                    }
            }
        }
        return value;
    });
    return jsonObject;
}

答案 1 :(得分:0)

对于将来的用户,请参阅此答案,该答案使用GraphAdapterBuilder:https://stackoverflow.com/a/10046134/1547266