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

Gson反序列化嵌入成员的json

夏侯星洲
2023-03-14

我有以下JSON示例:

{
 "birds":[
  {
     "id":"SAMPLEID",
     "isTest":true,
     "externalId":{
        "Main":[
           "123ABC"
        ],
        "Sub":[
           "456"
        ]
     },
     "dinos":[

     ],
     "rhinos":[
        {
           "id":"SUPER100ID",
           "isTest":true,
           "externalId":{
              "famousId":[
                 "23|45"
              ]
           },
           "dinos":[

           ],
           "pelicans":[
              {
                 "id":"D4CLIK",
                 "isTest":true,
                 "bird":null,
                 "crazyArray":[

                 ]
              },
              {
                 "id":"DID123",
                 "type":"B",
                 "name":"TONIE",
                 "isTest":true,
                 "bird":null,
                 "subspecies":[

                 ]
              }
           ]
        }
     ]
  }
],
"metaData":{
  "count":1
}
}

我想使用GSON来反序列化这个JSON字符串,并只获取“famousId”成员的值。

我已经看过了其他答案,似乎我绝对需要为此创建类。

有没有可能不映射POJO,使用JsonParser,JsonElement,JsonArray等反序列化?我已经尝试了几种排列,但没有成功。

我也尝试过以下代码,但也没有按预期工作:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject();

Gson gson = new Gson();
enterprises ent = new enterprises();
ent = gson.fromJson(o, enterprises.class);


@Getter
@Setter
class birds {
    @JsonProperty("rhinos")
    List<Rhino> rhinos = new ArrayList<Rhino>();
}

@Getter
@Setter
class Rhino {
    @JsonProperty("externalId")
    ExternalId externalId;
}

@Getter
@Setter
@JsonPropertyOrder({
    "famousId"
    })
class ExternalId {
    @JsonProperty("famousId")
    List<String> famousId = new ArrayList<String>();
} 

不幸的是,这也不起作用,所以我想一个两部分的问题。。。可以简单地反序列化并获取我想要的famousId的字符串值吗?我当前的类结构有什么不正确的地方吗?

共有1个答案

莘聪
2023-03-14

你差不多完成了。我为json结构添加了一个根类(Enterprises)。

class Enterprises {
    List<Birds> birds;
}

class Birds {
    List<Rhino> rhinos;
}

class Rhino {
    ExternalId externalId;
}

class ExternalId {
    List<String> famousId;
} 

运行下面的代码:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject();
Gson gson = new Gson();

Enterprises enterprises = gson.fromJson(o, Enterprises.class);
System.out.println("famousId:" + enterprises.birds.get(0).rhinos.get(0).externalId.famousId.get(0));

输出:

famousId:23|45

或者如果不想使用pojo类:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject();
JsonArray birdsJsonArray = (JsonArray) o.get("birds");
JsonArray rhinosJsonArray = (JsonArray)((JsonObject)(birdsJsonArray.get(0))).get("rhinos");
JsonObject externalIdJsonObject = (JsonObject)((JsonObject)(rhinosJsonArray.get(0))).get("externalId");
JsonArray famousIdJsonArray = (JsonArray)externalIdJsonObject.get("famousId");

System.out.println("famousId:" + famousIdJsonArray.get(0));

输出:

famousId:23|45
 类似资料:
  • 问题内容: 在我当前的项目中,我在android中使用GSON库,并且遇到了嵌套地图反序列化的问题。这就是初始json的样子 而我的pojo的 和花类 但是当我尝试反序列化此对象时,我可以访问嵌套的哈希图,示例代码为 有什么建议? 问题答案: 这告诉Gson您想反序列化为未知值类型的Map。您可能会想指定类似的东西,但是您无法在Java中进行指定,因此解决方案是使用他们在Gson中称为TypeTo

  • 问题内容: 我试图读取JSON文件并将其转换为数组,但是在读取JSON文件后从数组获取空值。我正在为我的班级使用默认构造函数。 JSON文件: 本类: 问题答案: 您的Gson映射与给定的JSON不匹配。默认情况下,Gson通过 确切 名称将JSON属性映射到目标映射中的相应字段。看一眼: 和 属性名称大小写和字段名称大小写不匹配。您需要的是正确映射JSON。要么: 或通过覆盖名称匹配(这更适合J

  • 问题内容: 我正在使用gson改造,将json反序列化为领域对象。在大多数情况下,这非常有效。处理时出现麻烦 RealmList(String(或任何其他基本数据类型)) 由于Realm不支持E不扩展Realm对象的RealmList,因此我将String封装在RealmObject中。 我的领域对象如下 SimpleRealmObj正常工作,因为它只有String元素 如何反序列化stringS

  • 问题内容: 所有,我都有以下输出/字符串(它是JIRA API的响应): 我用于遍历元素并获取值。我在下面的“嵌套对象”示例中编写了类 http://www.javacreed.com/gson-deserialiser- example/ 我能够获得到第二级的元素值。例如:在此级别之前,我能够获得的值以及其他值。我如何获得的价值? 我应该如何构造我的解串器和类。请协助。谢谢。 问题答案: 试试这

  • 问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问

  • 我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数: