栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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);}

当然,这需要在具有

tr
and
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);

如果

a
b
等是重要的......嗯,你必须明白这一点。但是上面的内容应该可以使您更好地理解处理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中包含一个或多个数组。再次强调一下,
这确实很棘手,而且做错了方法 ,但是我想我会解释直接解析该数组需要什么。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号