Java 将带有嵌套对象的JSON映射到GSON

Java 将带有嵌套对象的JSON映射到GSON,java,json,parsing,gson,confluent-schema-registry,Java,Json,Parsing,Gson,Confluent Schema Registry,我有一个JSON模式类,它是使用AVRO自动生成的。我想使用这个JSON创建一个GSON对象。我试着用这个代码来实现 @Test public void parseJson() { JSONParser jsonParser = new JSONParser(); try { JSONObject jsonObject = (JSONObject) jsonParser.parse(new FileReader("/pat

我有一个JSON模式类,它是使用AVRO自动生成的。我想使用这个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

GSON支持嵌套对象。只需创建与Json匹配的模型(但使用Java/Kotlin)并将其提交给GSON即可。您甚至可以使用列表而不是数组


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

使用Avro根据json自动创建模型。所以我不明白为什么GSON不能与之匹配,有趣的是我从未与jsonObject和GSON合作过。通常情况下,改造会处理一些事情。我只是看了一段代码,我是手动完成的。在这里,我首先使用
Gson.getAdapter(ThinEvent.class)
获得一个适配器,然后将整个字符串传递给它。但我刚刚意识到,您发布的json不是以对象
{…}
开始的,而是立即以值开始的。我刚刚检查了一下,我使用的json确实以一个大括号开始,以一个没有键的小括号结束。这实际上是一个打字错误,是以大括号开始和结束的,现在编辑好了,我只是复制了json,键入了类,并以json作为字符串运行,然后首先获取适配器。这对我完全有效。不过我注意到了一些事情。“时间戳”和“版本”大写。检查它们是否在生成的类中,因为这违反了java约定。与“com.lm.gde.eventing.avro.RefService”相同,它不是变量的有效名称,但在Json中。我用@SerializedName(“”)Gson anotationok解决了所有这些问题,所以如果我在refService和links变量上使用@SerializedName,那么这是可行的,但我的问题是这些类是生成的,所以在生成类时必须进行手动更改
private java.util.List<com.lm.gde.eventing.avro.Reference> references;
{
  "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"
}