Java Gson:反序列化元素类型不同的数组
我尝试用Gson库反序列化json字符串; 我有以下课程Java Gson:反序列化元素类型不同的数组,java,json,parsing,gson,Java,Json,Parsing,Gson,我尝试用Gson库反序列化json字符串; 我有以下课程 class Foo { int Id; String Name; } 以及下面的json字符串 {response: [123, { id: 1, name: 'qwerty'}, { id: 2, name: 'asdfgh'}, ]} 我尝试反序列化此字符串,以便 Gson gson = new Gson(); Foo[] res = gson.fromJson(jsonStr, Foo[].cl
class Foo {
int Id;
String Name;
}
以及下面的json字符串
{response: [123, { id: 1, name: 'qwerty'}, { id: 2, name: 'asdfgh'}, ]}
我尝试反序列化此字符串,以便
Gson gson = new Gson();
Foo[] res = gson.fromJson(jsonStr, Foo[].class);
但我失败了,因为这个字符串不包含纯json数组,而是包含字段“response”的对象,该字段就是数组。
我的第二个问题是,除了Foo对象之外,response包含文字“123”
我想知道如何避免这些问题?我是否应该手动解析字符串,提取数组的内容,从中删除不必要的文本,并将解析结果提供给fromJson方法,或者
有什么方法可以让我做得更简单 没有与您尝试反序列化的json数组兼容的Java类型。您应该使用JsonParser获取JsonObject,然后手动处理该JsonObject
JsonParser p = new JsonParser();
JsonObject jsonObject = (JsonObject)p.parse(yourJsonString);
然后,您可以像这样处理jsonObject:
List<Foo> foos = new ArrayList<Foo>();
JsonArray response = jsonObject.getAsJsonArray("response");
for (int i = 0; i < response.size(); i++) {
JsonElement el = response.get(i);
if (el.isJsonObject()) {
Foo f = new Foo();
JsonObject o = el.getAsJsonObject();
int id = o.getAsJsonPrimitive("id").getAsInt();
String name = o.getAsJsonPrimitive("name").getAsString();
f.Id = id;
f.Name = name;
foos.add(f);
}
}
List<Foo> foos = new ArrayList<Foo>();
JsonArray response = jsonObject.getAsJsonArray("response");
for (int i = 0; i < response.size(); i++) {
JsonElement el = response.get(i);
if (el.isJsonObject()) {
JsonObject o = el.getAsJsonObject();
Foo f = gson.fromJson(o, Foo.class);
foos.add(f);
}
}
class Foo {
int id;
String name;
}
没有所谓的“纯”JSON数组。RFC 7159明确指出,根本不要求JSON数组的所有成员都必须是同一类型的(更重要的是,您的JSON实际上不是合法的JSON)。好吧,将此数组转换为“纯”(或“合法”)的最简单、最快的方法是什么?读作
JsonElement
,并过滤掉不必要的元素,然后反序列化;这是我的建议。另一个解决方案是,如果要使用gson.fromJson(),则通常使用流式API,需要确保类成员名称与Json字符串中的属性名称匹配。你的不是因为资本化。