【问题标题】:Jackson not parsing all fields when proguard is enabled启用 proguard 时杰克逊不解析所有字段
【发布时间】:2014-09-13 01:08:36
【问题描述】:

我有一个使用 Jackson 解析的模型类。

public class MyModel {

   private String x;
   private String y;

   @JsonProperty("zzzz")
   private String z;

   public String getX() { return x; }
   public String getY() { return y; }
   public String getZ() { return z; } 
}

返回的 JSON 具有键“x”、“y”和“zzzz”。当我在没有启用 proguard 的情况下运行它时,它工作得非常好,我能够读取所有三个变量的值。

当我运行 proguard 时,我只能得到“z”而其他的都是空的。

即使键名与字段名相同,我是否应该为我的所有字段添加 JsonProperty("field_name")?

我正在使用最新的 jackson 库 (2.4.2)。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: java android jackson proguard


    【解决方案1】:

    MyModel 是一个不可变的类。必须有某种方法来初始化 MyModel 的状态。

    为了将 json 反序列化为 MyModel 对象,应该有一些机制来设置 x、y 和 z(或您需要的任何字段)的值。

    您可以为这些字段提供设置器,也可以使用 @JsonProperty("json_attribue") 正确设置 MyModel 对象的这些状态。

    我更愿意按以下方式实现这一点-

    public class MyModel {
    
      private String x;
      private String y;
      private String z;
    
      @JsonCreator
      public MyModel(@JsonProperty("x")String x, @JsonProperty("y")String y, @JsonProperty("zzzz")String z) {
          this.x = x;
          this.y = y;
          this.z = z;
       }
    
      public String getX() { return x; }
      public String getY() { return y; }
      public String getZ() { return z; }
    
    }
    

    使用 @JsonCreator 我们的构造函数将用于反序列化过程。

    【讨论】:

    • 完美。你知道这如何与proguard一起工作吗?我应该将这些模型类/注释保留在我的 proguard 设置中吗?
    • 此外,即使我没有指定 JsonProperty 注释,解析似乎也有效。这是因为变量名=字段名吗?
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 2019-11-25
    • 2019-11-09
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多