Jackson 2.2.3中属性的getter定义冲突

use*_*827 6 json jackson

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

class GetterMethodsObject {

    int id = 10;

    public int getId() {
        return id;
    }

    // @JsonIgnore
    public boolean isId() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

序列化此对象应该给出:

{"id":10}
Run Code Online (Sandbox Code Playgroud)

因为有公共吸气方法.用法示例:

mapper=new ObjectMapper();
mapper.writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

但我得到例外:

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)
Run Code Online (Sandbox Code Playgroud)

由于idInteger这样,我期待Jackson调用getId()方法,但不是isId().isId()只有当id是boolean时才应该调用方法?即使我@JsonIgnore说它没有帮助.我不能改变实际的对象.如何解决这个问题?

Mic*_*ber 3

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

  1. @JsonIgnore- 告诉Jackson忽略这个属性
  2. @JsonProperty("isId")- 告诉Jackson在序列化过程中使用此方法名称。它看起来像是Jackson发现了冲突,因为它发现了两种方法,并且这两种方法链接到一个字段 - id

你的POJO类应该如下所示:

class GetterMethodsObject {

    private int id = 10;

    public int getId() {
        return id;
    }

    @JsonIgnore
    @JsonProperty("isId")
    public boolean isId() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

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