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

时间:2016-05-10 09:41:05

标签: java json gson

我正在使用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

3 个答案:

答案 0 :(得分:0)

我不是GSON专家,我自己使用Jackson,但看起来您必须使用自定义类型适配器或反序列化器。这里做了类似的事情

对于LongInteger类型,

https://groups.google.com/forum/#!topic/google-gson/kNf5HADtY14

我想你必须采用提供的解决方案来满足你的需求。

此外,请求的行为已被报告为此处https://github.com/google/gson/issues/540缺少功能/错误,并且因为结果TypeAdapter被建议适合执行此作业

答案 1 :(得分:0)

使用Object作为child字段的类型,您需要实施不同的策略来处理child字段可能位于您使用的代码中的不同类型反序列化的Data实例

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

答案 2 :(得分:0)

While reading JsonElement child you need to check what kind of object it is, I mean check whether its a JsonObject or 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());
        }

    }