为什么杰克逊在不同情况下将这些值映射两次?

Jor*_*son 8 java json jackson

我正在使用Jackson将Java对象映射到JSON,该对象是一个非常简单的pojo类,如下所示:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonAutoDetect
public class Area {
    @JsonProperty("Id")
    public int Id;
    @JsonProperty("Name")
    public String Name;

    public Area() {
        Name = "";
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

映射代码如下所示:

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

areaJSON = mapper.writeValueAsString(area);
Run Code Online (Sandbox Code Playgroud)

但此时areaJSON的值如下:

{"id":0,"name":"","Name":"","Id":0}
Run Code Online (Sandbox Code Playgroud)

请注意具有不同情况的多个值.

我究竟做错了什么?

Mat*_*all 12

杰克逊认为这些领域IdName获取者返回的领域不同,因为情况不同.使用标准的JavaBean命名约定,杰克逊推断对应的getter的字段命名为idname,不IdName.

案件事件.


有两种简单的方法可以解决此问题:

  1. @JsonAutoDetect完全从此类中删除注释.我很确定默认的注释值优先于ObjectMapper配置.交替:

  2. 根本不要捣乱ObjectMapper.更改@JsonAutoDetect的类

    @JsonAutoDetect(
      fieldVisibility = Visibility.ANY,
      getterVisibility = Visibility.NONE,
      setterVisibility = Visibility.NONE,
      creatorVisibility = Visibility.NONE
    )
    
    Run Code Online (Sandbox Code Playgroud)

  • 为什么你的领域是公开的?为什么他们使用非传统的套管?Java中的字段名称应该是lowerCamelCased. (2认同)