Java 如果属性名不等于字段名,则Jackson自定义序列化程序将字段序列化两次
若使用自定义序列化,若属性名不等于字段名,则可能会产生意外效果。 为什么字段被序列化两次 我的代码示例:Java 如果属性名不等于字段名,则Jackson自定义序列化程序将字段序列化两次,java,json,serialization,jackson,Java,Json,Serialization,Jackson,若使用自定义序列化,若属性名不等于字段名,则可能会产生意外效果。 为什么字段被序列化两次 我的代码示例: class Mode { @JsonProperty("mode") @JsonSerialize(using = ModeSerializer.class) private boolean isPublic; public Mode(boolean isPublic) { this.isPublic = isPublic; }
class Mode {
@JsonProperty("mode")
@JsonSerialize(using = ModeSerializer.class)
private boolean isPublic;
public Mode(boolean isPublic) {
this.isPublic = isPublic;
}
public boolean isPublic() {
return isPublic;
}
}
这里是我的自定义字段序列化程序:
class ModeSerializer extends JsonSerializer<Boolean> {
@Override
public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
String out = "private";
if (value) {
out = "public";
}
gen.writeString(out);
}
}
因此,我收到:
{"public":true,"mode":"public"}
我做错了什么?Jackson遵循JavaBeans约定获取方法 根据这些说明,
isPublic
是名为public
的布尔属性的getter,与模式中的isPublic
字段不同。Jackson将把它序列化为“public”:true
除此之外,您还可以指定一个@JsonProperty
,Jackson将使用提供的名称mode
在字段中序列化该属性
@jsondeselliate
如果字段的名称与getter方法暗示的名称匹配,则字段上的注释会导致Jackson忽略getter。名为isPublic
的布尔字段的相应getter方法将是isIsPublic()
您将Json字段名指定为mode
并不影响上述内容。感谢您的详细回答。
你完全正确,我需要隔离getter Public,这不仅可以重命名此方法,还可以使用@JsonIgnore注释来对该方法进行操作。
像这样:
class Mode {
@JsonProperty("mode")
@JsonSerialize(using = ModeSerializer.class)
private boolean isPublic;
public Mode(boolean isPublic) {
this.isPublic = isPublic;
}
@JsonIgnore
public boolean isPublic() {
return isPublic;
}
}
这对我有用
class Mode {
@JsonProperty("mode")
@JsonSerialize(using = ModeSerializer.class)
private boolean isPublic;
public Mode(boolean isPublic) {
this.isPublic = isPublic;
}
@JsonIgnore
public boolean isPublic() {
return isPublic;
}
}