gpt4 book ai didi

java - Jackson 使用 @JsonAnyGetter 序列化重复字段

转载 作者:行者123 更新时间:2023-12-03 11:20:12 28 4
gpt4 key购买 nike

我的 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;
}
}
在这种情况下有没有办法只选择一个值?对于我的情况, 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;
}
}
很简单,但是坏了 getter通过修改 otherFields Map .我们可以通过添加一个经典的 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;
}
}

关于java - Jackson 使用 @JsonAnyGetter 序列化重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65436519/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com