您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Gson解析具有不同对象类型的数组的Json

Gson解析具有不同对象类型的数组的Json

《 Gson用户指南》明确涵盖了以下内容

https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and- Deserializing-Collection-with-Objects-of-Arbitrary- Types

您有一个对象,该对象的字段tr是包含任意类型的数组。

用户指南说明您不能直接反序列化这种结构,并建议:

使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)来解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法

在您的情况下,这实际上取决于该数组中可能存在的对象。如果它们都将具有相同的内部对象,则需要执行以下操作…

List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = parser.parse(json).getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je : array)
{
    Set<Map.Entry<String,JsonElement>> set = je.getAsObject().entrySet();
    JsonElement je2 = set.iterator().next().getValue();

    MyUserPojo mup = new Gson().fromJson(je2, MyUserPojo.class);
    list.add(mup);
}

当然,这需要在具有trand results字段的实际对象的自定义解串器中。

class MyPojo
{
    List<MyUserPojo> userList;
    int results; 
}

class MyUserPojo
{
    String userId;
    String address;
}

class MyDeserializer implements JsonDeserializer<MyPojo>
{
    @Override
    public MyPojo deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
                              throws JsonParseException
    {
        List<MyUserPojo> list = new ArrayList<MyUserPojo>();
        JsonArray array = je.getAsJsonObject().getAsJsonArray("tr");
        for (JsonElement je2 : array)
        {
            Set<Map.Entry<String,JsonElement>> set = je2.getAsObject().entrySet();
            JsonElement je3 = set.iterator().next().getValue();

            MyUserPojo mup = new Gson().fromJson(je3, MyUserPojo.class);
            list.add(mup);
        }

        MyPojo mp = new MyPojo();
        mp.tr = list;
        mp.results = je.getAsObject().getAsJsonPrimitive("results").getAsInt();

        return mp;
    }
}

现在您已经准备就绪-您可以使用该反序列化器并创建您的对象:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(MyPojo.class, new MyDeserializer())
                .build();

MyPojo mp = gson.fromJson(json, MyPojo.class);

如果ab等是重要的......嗯,你必须明白这一点。但是上面的内容应该可以使您更好地理解处理JSON结构所需的内容

为了完整起见,解决此问题的唯一“方法”是,如果这些类型的数量相当有限,并且内部对象的字段也受到很大限制。您可以创建一个包含所有可能性的POJO:

class MyPojo 
{
    MySecondPojo a;
    MySecondPojo b;
    ...
    MySecondPojo f;
}

class MySecondPojo
{
    String userId;
    String address;
    ...
    String someOtherField;
}

当Gson反序列化JSON时,会将您的POJO中的所有缺失字段设置为null。您现在tr可以List在POJO中包含一个或多个数组。再次强调一下, ,但是我想我会解释直接解析该数组需要什么。

其他 2022/1/1 18:14:11 有583人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶