如何使用Gson解析此JSON?我有一个具有多个对象类型的数组,但我不知道需要创建哪种对象来保存此结构。我无法更改json消息(我无法控制服务器)。
唯一起作用的类是
public class Response { private List<Object> tr; private int results; (...) }
JSON消息 (请注意具有多个对象类型的数组。)
{ "tr": [ { "a": { "userId": "112" } }, { "b": { "userId": "123", "address":"street dummy" } }, { "a": { "userId": "154" } } ], "results":3 }
《 Gson用户指南》明确涵盖了以下内容:
https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and- Deserializing-Collection-with-Objects-of-Arbitrary- Types
您有一个对象,该对象的字段tr是包含任意类型的数组。
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字段的实际对象的自定义解串器中。
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结构所需的内容。
a
b
为了完整起见,解决此问题的唯一“方法”是,如果这些类型的数量相当有限,并且内部对象的字段也受到很大限制。您可以创建一个包含所有可能性的POJO:
class MyPojo { MySecondPojo a; MySecondPojo b; ... MySecondPojo f; } class MySecondPojo { String userId; String address; ... String someOtherField; }
当Gson反序列化JSON时,会将您的POJO中的所有缺失字段设置为null。您现在tr可以List在POJO中包含一个或多个数组。再次强调一下, 这确实很棘手,而且做错了方法 ,但是我想我会解释直接解析该数组需要什么。
null
List