我在JSON遇到问题我从Bugzilla服务器回来了,因为它有时会返回“text”:{},有时候会回复“text”:“blah blah blah”。如果没有给出bug的描述,Bugzilla会返回前者。我很困惑为什么它不会作为更明智的“文本”回来:“”但它确实存在并且就是这样。
如果我在Gson的目标对象中有一个String命名文本,它会在看到{}大小写时对象,因为它表示它是一个对象而不是一个String:
Exception in thread "main" com.google.gson.JsonParseException: The
JsonDeserializer StringTypeAdapter failed to deserialized json object {} given
the type class java.lang.String
关于如何让Gson解析这个问题的任何建议?
答案 0 :(得分:1)
Gson要求针对原始问题中的情况进行自定义反序列化。以下是一个这样的例子。
<强> input.json:强>
[
{
"text":"some text"
},
{
"text":{}
}
]
<强> Foo.java:强>
import java.io.FileReader;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
public class Foo
{
public static void main(String[] args) throws Exception
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
Gson gson = gsonBuilder.create();
Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class);
System.out.println(gson.toJson(things));
}
}
class Thing
{
String text;
}
class StringDeserializer implements JsonDeserializer<String>
{
@Override
public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
if (json.isJsonPrimitive()) return json.getAsString();
return "";
}
}
<强>输出:强>
[{"text":"some text"},{"text":""}]
当然可以使用Thing.class
类型的自定义反序列化器。这样做的好处是不会为每个String
添加额外的处理,但是你会被“手动”处理Thing
的所有其他属性。
答案 1 :(得分:0)
尝试将text
字段声明为Object
。然后做一些事情:
public String getTextAsString() {
if (text instanceof String) {
return (String) text;
else {
return null;
}
}
您应该将此报告为Bugzilla项目的错误。这种行为没有充分的理由。