Java 使用@JsonAnyGetter复制字段
我有一个DTO类,其中包含预定义的字段和非映射的映射。当otherFields映射包含具有相同名称(field1键)的字段时,jackson会序列化这两个字段,我有无效的jsonJava 使用@JsonAnyGetter复制字段,java,spring,jackson,jackson-databind,Java,Spring,Jackson,Jackson Databind,我有一个DTO类,其中包含预定义的字段和非映射的映射。当otherFields映射包含具有相同名称(field1键)的字段时,jackson会序列化这两个字段,我有无效的json { "field1": "value", "field1": "otherValue" } 公共类DTO实现可序列化{ 私有字符串字段1; @杰索尼奥雷 @JSONANYSETER private final Map otherField
{
"field1": "value",
"field1": "otherValue"
}
公共类DTO实现可序列化{
私有字符串字段1;
@杰索尼奥雷
@JSONANYSETER
private final Map otherFields=new LinkedHashMap();
@JsonAnyGetter
公共映射getOtherFields(){
返回其他字段;
}
公共字符串getField1(){
返回字段1;
}
公共无效集合字段1(字符串字段1){
此字段1=字段1;
}
}
在这种情况下,有没有办法只选择一个值?对于我的情况,map中的一个应该具有优先权。我建议的最简单的解决方案是忽略属性,并在
getter
标记为JsonAnyGetter
的注释中添加额外的逻辑来检查此条件:
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;
}
}
要实现这一点,您应该为DTO类实现JsonSerializer,以便在序列化中编写逻辑method@AbhisekLamsal还有其他复杂的选择吗?我的类有很多字段和嵌套对象,都有相同的问题。我怀疑是否有其他方法可以解决您的特定问题。另一个选项可以是在所有字段中添加JsonIgnore,并修改getter和setter,以便在getter中从映射返回值,并在所有setter中向映射添加值。无论哪种方式,您都必须自定义此处的所有类
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;
}
}
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;
}
}