【问题标题】:@JsonProperty on class fields - getting duplicate fields in JSON类字段上的@JsonProperty - 获取 JSON 中的重复字段
【发布时间】:2017-06-13 19:47:08
【问题描述】:

我有一个有一些领域的学生。我想为返回的 JSON 字段提供自定义名称。

public class Student {


    @JsonProperty("name")
    private String mName;

    @JsonProperty("DOB")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private Date mBirthDate;

    @JsonProperty("SSN")
    private String mSocialSecurityNumber;

    public Student() {
    }

    public Student(String mName, Date mBirthDate, String mSocialSecurityNumber) {
        this.mName = mName;
        this.mBirthDate = mBirthDate;
        this.mSocialSecurityNumber = mSocialSecurityNumber;
    }


    public String getName() {
        return mName;
    }

    public void setName(String mName) {
        this.mName = mName;
    }

    public Date getBirthDate() {
        return mBirthDate;
    }

    public void setBirthDate(Date mBirthDate) {
        this.mBirthDate = mBirthDate;
    }

    public String getSocialSecurityNumber() {
        return mSocialSecurityNumber;
    }

    public void setSocialSecurityNumber(String mSocialSecurityNumber) {
        this.mSocialSecurityNumber = mSocialSecurityNumber;
    }
}

我的 JSON 输出既有原始字段名称(基于 getter 名称,例如 getSocialSecurityNumber()),也有在我的 @JsonProperty 属性中指定的名称。

似乎如果我将@JsonProperty 属性移动到getter,那么我不会得到字段的加倍。有没有办法通过在字段上添加注释来做到这一点,我觉得这样更干净一些?

【问题讨论】:

    标签: java json spring-boot jackson


    【解决方案1】:

    ObjectMapper 配置为仅考虑字段:

    ObjectMapper mapper = new ObjectMapper();    
    mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
    mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
    

    在Spring Boot中你可以使用Jackson2ObjectMapperBuilder来配置ObjectMapper

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    
        return new Jackson2ObjectMapperBuilder() {
    
            @Override
            public void configure(ObjectMapper objectMapper) {
                super.configure(objectMapper);
                objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
                objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            }
        };
    }
    

    【讨论】:

    • 不熟悉 ObjectMapper -- 不使用它。这一切都发生在我通过 Spring Boot 1.4.3
    • @StealthRabbi 所以你可以使用Jackson2ObjectMapperBuilder。让我举个例子。
    • 看起来我可以操作 bean,如下所示:stackoverflow.com/questions/28324352/…
    • 这很有帮助。因此,默认值大概是 PropertyAccessor.GETTER,这就解释了为什么在没有 @JsonProperty 标记的情况下,我的 JSON 字段是“name”而不是“mName”。
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2014-05-11
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多