Jackson 2.2.3中属性的getter定义冲突

时间:2014-03-19 03:27:56

标签: json jackson

为简单起见,这是一个简单的类:

class GetterMethodsObject {

    int id = 10;

    public int getId() {
        return id;
    }

    // @JsonIgnore
    public boolean isId() {
        return true;
    }
}

序列化此对象应该给出:

{"id":10}

因为有公共getter方法。用法示例:

mapper=new ObjectMapper();
mapper.writeValueAsString(object);

但我得到例外:

com.fasterxml.jackson.databind.JsonMappingException:
Conflicting getter definitions for property "id": org.citi.facility.GetterMethodsObject#isId(0 params) vs org.citi.facility.GetterMethodsObject#getId(0 params)

由于idInteger所以,我希望Jackson可以调用getId()方法而不是isId()。只有当id是boolean时才应该调用isId()方法?即使我把@JsonIgnore放在一边也没帮助。我不能改变实际的对象。如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

Jackson库检查用于序列化/反序列化的getter / setters方法。你可以通过下面的脏黑客来省略这个恼人的bug。您必须使用两个注释:

  1. @JsonIgnore - 告诉Jackson忽略此属性
  2. @JsonProperty("isId") - 告诉Jackson在序列化过程中使用此方法名称。看起来Jackson发现了碰撞,因为它找到了两种方法,这两种方法链接到一个字段 - id
  3. 您的POJO课程应如下所示:

    class GetterMethodsObject {
    
        private int id = 10;
    
        public int getId() {
            return id;
        }
    
        @JsonIgnore
        @JsonProperty("isId")
        public boolean isId() {
            return true;
        }
    }
    

    另一种解决方案:您应该重命名isId方法,因为它令人困惑。您应该考虑:hasId甚至更好hasValidId。我不知道您的isId方法正在做什么,但您应该在方法名称中提供更多信息。