有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有@JsonAnyGetter的java序列化重复字段

我有一个DTO类,其中包含预定义的字段和非映射的映射。当otherFields映射包含具有相同名称(field1键)的字段时,jackson会序列化这两个字段,我有无效的json

{
"field1": "value",
"field1": "otherValue"
}
public class DTO implements Serializable {

    private String field1;

    @JsonIgnore
    @JsonAnySetter
    private final Map<String, Object> otherFields = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getOtherFields() {
        return otherFields;
    }

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }
}

在这种情况下,有没有办法只选择一个值?对于我的情况,地图上的一个应该有优先权


共 (1) 个答案

  1. # 1 楼答案

    我建议的最简单的解决方案是忽略属性,并在由JsonAnyGetter注释标记的getter中添加额外的逻辑来检查此条件:

    class DTO {
    
        @JsonIgnore
        private String field1;
    
        private final Map<String, Object> otherFields = new LinkedHashMap<>();
    
        @JsonAnyGetter
        public Map<String, Object> getOtherFields() {
            otherFields.putIfAbsent("field1", field1);
    
            return otherFields;
        }
    
        @JsonAnySetter
        public void setOtherFields(String key, Object value) {
            otherFields.put(key, value);
        }
    
        public String getField1() {
            return field1;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    }
    

    它很简单,但是通过修改otherFields{}来中断getter。我们可以通过添加一个经典的getter和一个Jackson来改进它:

    class DTO {
    
        private String field1;
        private final Map<String, Object> otherFields = new LinkedHashMap<>();
    
        @JsonIgnore
        public Map<String, Object> getOtherFields() {
            return otherFields;
        }
    
        @JsonAnyGetter
        private Map<String, Object> internalJacksonGetOtherFields() {
            otherFields.putIfAbsent("field1", field1);
    
            return otherFields;
        }
    
        @JsonAnySetter
        public void setOtherFields(String key, Object value) {
            otherFields.put(key, value);
        }
    
        @JsonIgnore
        public String getField1() {
            return field1;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    }