java—我应该如何处理可以是对象或字符串的json字段?

xmq68pz9  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(328)

我使用gson反序列化json数据。现在,数据有一个奇怪的地方,即某个字段可能是空字符串或对象(类似对象的嵌套树状结构)。该如何处理?
json看起来像这样:

[
    {
        "data": {
            "foo": "bar",
            "child": ""            <-- If no children
        }
    },
    {
        "data": {
            "foo": "baz",
            "child": {            <-- If a child
                "foo": "bat",
                "child": ""
            }
        }
    },
]

pojo如下所示:

public class Data {
    private String foo;
    private Data child;
}

当试图反序列化json和 child 字段是 "" ,引发的异常为:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
xlpyo6sf

xlpyo6sf1#

阅读时
JsonElement child 你需要检查它是什么样的物体,我的意思是检查它是否是 JsonObject 或者 String(or any Primitive data type) ```
JsonArray response = your_array_response;
for (int i = 0; i < response.size(); i++) {

    JsonObject object = response.get(i).getAsJsonObject();

    JsonObject dataObject = object.get("data").getAsJsonObject();
    JsonElement element = dataObject.get("child");

    if (element.isJsonObject()) {
        JsonObject childObject = element.getAsJsonObject();
        System.out.println("JsonObject : Foo = "+childObject.get("foo").getAsString());
    } else if (element.isJsonPrimitive()) {
        System.out.println("A String: value = " + element.getAsString());
    }

}
ctehm74n

ctehm74n2#

使用 Object 作为您的 child 字段中,您将需要实现不同的策略来处理不同的类型 child 字段可以在使用反序列化 Data 示例

public class Data {
    private String foo;
    private Object child;
}
1dkrff03

1dkrff033#

我不是gsonMaven,我正在使用 Jackson 但看起来您必须使用自定义类型适配器或反序列化程序。这里也做过类似的事情
https://groups.google.com/forum/#!topic/google gson/knf5hadty14 Long 以及 Integer 类型。
我想您将不得不采用所提供的解决方案来满足您的需要。
此外,请求的行为在这里被报告为缺少特性/错误https://github.com/google/gson/issues/540,作为结果 TypeAdapter 建议适合做这项工作

相关问题