我知道这可能是一个糟糕的JSON API实践的例子,但是我被迫处理这样的JSON响应:
{
"error": "Username required."
}
但是当它没有错误时,error
字段变为布尔值:
{
"error": false
}
如何以干净的方式在Gson(最好是配置最少)中正确处理它?</ p>
注意:在POJO中我有String getErrorMessage()
和boolean isError()
答案 0 :(得分:1)
如果没有编写自定义反序列化器,Gson就无法做到这一点。 Gson Design Document包含以下段落:
在反序列化时导航Json树或目标类型树
当您将Json字符串反序列化为所需类型的对象时,您可以导航输入树或所需类型的类型树。 Gson使用后一种方法来导航目标对象的类型。这使您可以严格控制仅实例化您期望的对象类型(基本上根据预期的&#34;架构&#34;验证输入)。通过这样做,您还可以忽略Json输入但不期望的任何额外字段。
从这里你可以看到Gson在尝试反序列化JSON时会查看你的对象,因此不会考虑更改JSON文档中的类型。
您可以做的是write a your own serialiser/deserialiser并在反序列化文档之前注册它。
答案 1 :(得分:1)
这样的事应该做。
public class Main
{
public static void main(String args[])
{
Gson gson = new Gson();
Something s = new Something();
s.setError("Success");
System.out.println(gson.toJson(s));
s.setError(false);
System.out.println(gson.toJson(s));
}
}
Class&#34; Something&#34;看起来:
public class Something
{
private Object error;
public Object getError()
{
return error;
}
public void setError(Object error)
{
this.error = error;
}
}
输出:
{"error":"Success"}
{"error":false}