当前位置: 首页 > 知识库问答 >
问题:

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

杜茂
2023-03-14

由于几个循环引用,我遇到了通过GoogleGSON序列化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/#!主题/google-gson/z2Ax5T1kb2M

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

这工作得很好,但我仍然无法通过对象图动态访问参考值(0xn),例如:

警报(0x3.company.name);--

有可能实现这一点吗?

也许用一个定制的< code>JSON.parse(ajaxResponse,function(key,value) {}函数用引用的对象树替换变量?

共有2个答案

太叔繁
2023-03-14

!!更新,更好的解决方案!!

如果你能切换你的库,就用FlexJson

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

“ref”是原始GraphAdapterBuilder中的”0x[n]“

资料来源:

$.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;
}
汤兴生
2023-03-14

对于未来的用户,参考这个使用GraphAdapterBuilder的答案:https://stackoverflow.com/a/10046134/1547266

 类似资料:
  • 问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r

  • 我陷入了一个问题,需要在反序列化过程中使用和将解析对象的引用设置为其子对象。 为了描述这个问题,下面是类结构的简单表示。 通过这种结构,我可以通过向我的 提供 来在 中设置,例如: 我知道,我可以添加额外的到我的,但我不知道如何提供我的对象的引用,该对象正在被解析(即时)到对象? 任何帮助将不胜感激!

  • 我正在使用Spring Boot和Thymeleaf为我的应用程序创建一个登录页。为此,我需要呈现所有包含容器的主机对象的列表。以下是相关代码: 现在,我想遍历所有服务器,并在表中显示关于每个容器的信息。我的Thymeleaf模板如下所示: 我的问题是访问容器属性的部分(由注释标记)。每次我都会得到一个SpringEL异常。如果我删除并将其替换为会显示容器的String版本,因此我可以访问对象和它

  • 问题内容: 我有一个包含循环引用的JavaScript对象定义:它具有一个引用父对象的属性。 它还具有一些我不想传递给服务器的功能。我将如何序列化和反序列化这些对象? 我读过,做到这一点的最好方法是使用道格拉斯·克罗克福德的stringify。但是,我在Chrome中遇到以下错误: TypeError:将圆形结构转换为JSON 编码: 这是我为这个问题创建的测试用例。这段代码中有错误,但是本质上我

  • 我有一个包含循环引用的JavaScript对象定义:它有一个引用父对象的属性。 它还有一些我不想传递给服务器的函数。如何序列化和反序列化这些对象? 我读过这样做的最好方法是使用Douglas Crockford的stringify。但是,我在Chrome中遇到以下错误: 将圆形结构转换为JSON 守则: 这是我为这个问题创建的测试用例。这段代码中有一些错误,但基本上我在对象中有对象,并向每个对象传

  • 我在反序列化遵循以下格式的Json数组时遇到了一些问题: 它基本上是一个类别数组,其中每个类别也可以有一个子类别列表,依此类推。我的类模型看起来有点像这样: 现在,Gson显然抱怨循环引用。有没有办法解析这个Json输入,因为我不能假设有多少个类别级别?提前感谢。 编辑:以防万一有人有类似的问题,根据Spaeth的回答,我将解决方案调整为使用反射的更一般的情况。唯一的要求是JSON数组表示的对象列