如何在Gson中使用两种可能的类型(布尔值和字符串)反序列化字段

时间:2014-11-25 05:04:53

标签: java json gson deserialization

我知道这可能是一个糟糕的JSON API实践的例子,但是我被迫处理这样的JSON响应:

{
   "error": "Username required."
}

但是当它没有错误时,error字段变为布尔值:

{
   "error": false
}

如何以干净的方式在Gson(最好是配置最少)中正确处理它?<​​/ p>

注意:在POJO中我有String getErrorMessage()boolean isError()

2 个答案:

答案 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}