java - GSON - 如何解析两个名称相同但参数不同的 JSONArray?

标签 java android json gson

在 Reddit JSON API 中,评论可以包含两种不同类型的 JSONArray,都称为“子项”。

“children”通常是包含字符串“kind”和对象“data”的对象数组:

"children": [ { "kind": "t3", "data": {} } ...]

我一直在处理这些问题。我的问题是,有时 children 会是一个简单的字符串数组:

"children": [ "e78i3mq", "e78hees", "e78jq6q" ]

解析这些时,GSON 会抛出如下异常:

Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3780 path $[1].data.children[0].data.replies.data.children[0].data.replies.data.children[0].data.replies.data.children[0].data.children[0]

如何处理这些字符串数组情况?

最佳答案

如果同一端点在某些情况下返回不同的类型,我建议将该部分包装在一个对象中并使用反序列化器来检查类型并相应地分配。你可以这样做:

public Parent serialize(String jsonString) {
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(WrappedChild.class, new ChildDeserializer());
    Gson gson = builder.create();
    return gson.fromJson(jsonString, Parent.class);
}

class Parent {
    public List<WrappedChild> children;
}

class ObjectChild {
    public String body;
}

class WrappedChild {
    public ObjectChild objectChild;
    public String stringChild;
}

class ChildDeserializer implements JsonDeserializer<WrappedChild> {
    private Gson gson = new Gson();

    @Override
    public WrappedChild deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json != null) {
            if (json.isJsonObject()) {
                WrappedChild result = new WrappedChild();
                result.objectChild = gson.fromJson(json, ObjectChild.class);
                return result;
            } else if (json.isJsonPrimitive()) {
                WrappedChild result = new WrappedChild();
                result.stringChild = json.getAsString();
                return result;
            }
        }
        return null; // Or throw new Exception("Unknown child type");
    }
}

如果您使用改造,只需在创建服务时将构建器创建的 Gson 作为参数传递给 GsonConverterFactory.create

关于java - GSON - 如何解析两个名称相同但参数不同的 JSONArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52673380/

相关文章:

android - 滑动菜单示例 : issue in import to eclipse

android - 来自 google direction API 的 JSON 解析

python - 如何更改 json 数据的结构并在 python 上添加新字段

ios - 如何减少responseJSON 中的样板文件,就像我使用 URLRequestConvertible 对相关的 Web 调用进行分组一样

java - 如何将随机数从Java类传递到html文件

java - Kafka 产生多值消息

java - 使用 postgresql 进行 elastisticsearch 全文搜索

java - Android 切换按钮保存状态自定义 ListView

java - Android - support.v7.PreferenceCategory 填满整个屏幕

java - 在android中从micro SD卡读取文件