【问题标题】:How to deserialize fields with two possible type (boolean and String) in Gson如何在 Gson 中反序列化具有两种可能类型(布尔值和字符串)的字段
【发布时间】:2014-11-25 05:04:52
【问题描述】:

我知道这可能是一个糟糕的 JSON API 实践示例,但我不得不像这样处理 JSON 响应:

{
   "error": "Username required."
}

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

{
   "error": false
}

如何在 Gson 中以干净的方式正确处理它(最好使用最少的配置)?

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

【问题讨论】:

    标签: java json gson deserialization


    【解决方案1】:

    如果不编写自定义反序列化器,Gson 就无法做到这一点。 Gson Design Document 包括这一段:

    在反序列化时导航 Json 树或目标类型树

    当您将 Json 字符串反序列化为所需类型的对象时,您可以导航输入树或所需类型的类型树。 Gson 使用后一种方法来导航目标对象的类型。这使您可以严格控制仅实例化您期望的对象类型(本质上是根据预期的“模式”验证输入)。通过这样做,您还将忽略 Json 输入具有但不是预期的任何额外字段。

    由此您可以看到 Gson 在尝试反序列化 JSON 时会查看您的 对象,因此不会考虑 JSON 文档中类型的更改。

    你可以做的是write a your own serialiser/deserialiser并在反序列化文档之前注册它。

    【讨论】:

      【解决方案2】:

      应该这样做。

       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));
              }
          }
      

      “某物”类看起来:

      public class Something
      {
          private Object error;
      
          public Object getError()
          {
              return error;
          }
      
          public void setError(Object error)
          {
              this.error = error;
          }
      }
      

      输出:

      {"error":"Success"}
      {"error":false}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 2012-12-03
        相关资源
        最近更新 更多