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

标签 java json parsing gson

我尝试使用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);

然后您可以像这样处理您的 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;
}

关于java - Gson:反序列化元素类型不同的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516446/

相关文章:

java - 我们如何使用 getter 和 setter 访问私有(private)实例变量?

java - 将焦点从一个 EditText 移到另一个

java - 自定义 LDAP 失败登录尝试计数器

Python(新手)从 API 调用中解析 XML

python - 在 Python 中清理 HTML 解析

java - 答案对象和面向对象设计

java - Android - JSON 存储列表包含在应用程序退出、重新打开时恢复为父类(super class)的对象

javascript - 使用 jQuery 从 Json 填充选择/选项时,ASP.NET MVC 清空选择

java - 检查 JSONArray 是否实际上是 boolean 数组的整数

parsing - OCaml + Menhir 编译/写作