我正在使用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
答案 0 :(得分:0)
我不是GSON专家,我自己使用Jackson
,但看起来您必须使用自定义类型适配器或反序列化器。这里做了类似的事情
Long
和Integer
类型,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());
}
}