【问题标题】:Mapping JSON with nested object to GSON将带有嵌套对象的 JSON 映射到 GSON
【发布时间】:2019-10-02 09:45:13
【问题描述】:

我有一个使用 AVRO 自动生成的 JSON 模式类。我想使用这个 JSON 创建一个 GSON 对象。我尝试使用此代码这样做

    @Test
    public void parseJson() {

        JSONParser jsonParser = new JSONParser();
        try {
            JSONObject jsonObject = (JSONObject) jsonParser.parse(new FileReader("/pathto/test.json"));
            ThinEvent thinEvent = new Gson().fromJson(jsonObject.toString(), ThinEvent.class);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

但这会导致以下错误...看起来 GSON 正在寻找一个字符串,但 json 实际上包含一个嵌套对象? ThinEvent 对象已将 refService 声明为列表。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 74 path $.references[0].refService
private java.util.List<com.lm.gde.eventing.avro.Reference> references;

这是我的 JSON,我用 XXXX 替换了一些值。

{
  "eventType": "policy.PolicyPremiumChangedEvent",
  "correlationId": "XXXX",
  "references": [
    {
      "ref": "XXX",
      "refType": "policy_id",
      "refService": {
        "com.lm.gde.eventing.avro.RefService": "policy_service"
      },
      "links": {
        "array": [
          {
            "refUri": ""
          }
        ]
      }
    },
    {
      "ref": "XXXXXX",
      "refType": "policy_number",
      "refService": {
        "com.lm.gde.eventing.avro.RefService": "policy_service"
      },
      "links": {
        "array": [
          {
            "refUri": "XXXXXX"
          }
        ]
      }
    },
    {
      "ref": "2019-09-28",
      "refType": "policy_tx_effective_date",
      "refService": {
        "com.lm.gde.eventing.avro.RefService": "policy_service"
      },
      "links": {
        "array": [
          {
            "refUri": "XXXXX"
          }
        ]
      }
    }
  ],
  "eventContext": null,
  "Timestamp": 1569574003295,
  "Version": "1"
}

【问题讨论】:

    标签: java json parsing gson confluent-schema-registry


    【解决方案1】:

    GSON 支持嵌套对象check this article。只需创建与 Json 匹配的模型(但在 Java/Kotlin 中)并将其扔给 GSON。 Same with collections。您甚至可以使用 List 而不是数组。

    您可以将 json 文件作为一个完整的字符串获取并反序列化。

    【讨论】:

    • 模型是使用 Avro 基于 JSON 自动创建的。所以我不明白为什么 GSON 不匹配它
    • 有趣的是,我从未使用过 jsonObject 和 Gson。通常改造处理事情。我只是查看了一些我手动执行的代码。在那里,我首先使用Gson.getAdapter(ThinEvent.class) 获得一个适配器,然后将整个字符串传递给它。但我刚刚意识到您发布的 json 不是作为对象开始的 { ... } 而是立即带有值。我刚刚检查过,我使用它的 json 确实以一个左花括号开头,并以一个在它之前没有键的结尾结束。
    • 这实际上是一个错字,是以花括号开头和结尾的,现在编辑
    • 好的,我刚刚复制了您的 json 并输入了类,并使用 json 作为字符串运行它并首先获取适配器。它完全适合我。我注意到了几件事。 “时间戳”和“版本”大写。检查它们是否在生成的类中,因为这违反了 java 约定。与“com.lm.gde.eventing.avro.RefService”相同,这不是变量的有效名称,但在 Json 中。我用@SerializedName("") Gson 注释解决了所有这些问题
    • 好的,所以如果我在 refService 上使用 @SerializedName 并链接变量,那么这是可行的,但我的问题是这些类是生成的,因此在生成类时必须手动更改跨度>
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多