由于有几个循环引用,我有问题,要通过Google GSON序列化我的Java对象。我的所有尝试都以StackOverflowException结束,因为GSON无法处理这些循环引用。
作为解决方案,我找到了以下GraphAdapterBuilder
:
实施例: 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) {}
函数将变量替换为引用的对象树?
答案 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