Gson:反序列化元素不同类型的数组

时间:2015-02-14 14:11:09

标签: 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[].class);

但我失败了因为这个字符串不包含纯json数组,而是包含字段' response'那是阵列。 而我的第二个麻烦是回复包含文字' 123'除了Foo-objects。

我想知道如何避免这些问题?我应该手动解析字符串,提取数组的内容,从中删除不必要的文字并将解析结果提供给fromJson方法或者 有办法可以帮我简单吗?

1 个答案:

答案 0 :(得分:2)

没有与您尝试反序列化的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);
        }
    }

或者你可以像这样处理响应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类成员名称与json属性名称匹配。你的不是因为资本化。即你需要改变你的Foo类:

class Foo {
    int id;
    String name;
}