Gson:反序列化元素类型不同的数组
Gson: deserializing arrays where elements are not of same type
我尝试用 Gson 库反序列化 json 字符串;
我有以下 class
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' 的对象。
我的第二个问题是响应包含文字“123”,但 Foo 对象除外。
我想知道如何避免这些问题?我是否应该手动解析字符串,提取数组的内容,从中删除不必要的文字并将解析结果提供给 fromJson 方法或
有什么方法可以帮助我更简单地做到这一点?
没有与您尝试反序列化的 json 数组兼容的 Java 类型。您应该使用 JsonParser 获取 JsonObject,然后手动处理该 JsonObject。
JsonParser p = new JsonParser();
JsonObject jsonObject = (JsonObject)p.parse(yourJsonString);
然后您可以像这样处理您的 json对象:
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);
}
}
或者,您可以像这样处理响应 JsonArray:
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);
}
}
但是您需要确保 Foo class 成员名称与 json 属性 名称匹配。你的不是因为大写。也就是说,您需要将 Foo class 更改为如下所示:
class Foo {
int id;
String name;
}
我尝试用 Gson 库反序列化 json 字符串; 我有以下 class
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' 的对象。 我的第二个问题是响应包含文字“123”,但 Foo 对象除外。
我想知道如何避免这些问题?我是否应该手动解析字符串,提取数组的内容,从中删除不必要的文字并将解析结果提供给 fromJson 方法或 有什么方法可以帮助我更简单地做到这一点?
没有与您尝试反序列化的 json 数组兼容的 Java 类型。您应该使用 JsonParser 获取 JsonObject,然后手动处理该 JsonObject。
JsonParser p = new JsonParser();
JsonObject jsonObject = (JsonObject)p.parse(yourJsonString);
然后您可以像这样处理您的 json对象:
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);
}
}
或者,您可以像这样处理响应 JsonArray:
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);
}
}
但是您需要确保 Foo class 成员名称与 json 属性 名称匹配。你的不是因为大写。也就是说,您需要将 Foo class 更改为如下所示:
class Foo {
int id;
String name;
}