我可以在 Java Jackson 的反序列化过程中忽略基于 getter 的只写 属性 吗?
Can I ignore a getter-based write-only property during deserialization in Java Jackson?
我有一个遗产 JSON API class,我正在进化以删除某个 属性。目前,属性 值始终是相同的常量,因此我希望我的 Java 代码只是一个简单的 getter
,没有基础字段。我想继续序列化该值,直到我知道我的所有客户都已停止使用该值。该对象仅由我的客户读取,因此我不必担心他们会发送其他值。
public class MyType {
private String value;
public boolean isLegacyValue() {
return true;
}
}
就是说,如果我使用现在常量 属性 反序列化完整值,我不希望任何测试代码或类似代码失败。有没有一种方法可以让 Jackson 序列化 setter 方法 - 仅 属性,但在反序列化时忽略它?我尝试了几种不同的方法,但在反序列化时得到了 UnrecognizedPropertyException
。我宁愿不为这个 属性.
更改全局 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
{"value": "ABC", "legacyValue": true}
也可以接受的方法是告诉 Jackson 包含值而不包含 Java 字段。
我知道我可以在我的 setter 之外添加一个 getter,或者将其设为一个字段,但这两个选项感觉它们混淆了 Java API,因为它实际上并不匹配常量约束:
public void setLegacyValue(boolean legacyValue) {
// No-op; only exists for Jackson deserialization
}
我发现通过反复试验可以解决的一件事是将其作为最终字段。无论出于何种原因,Jackson 都知道将其作为只写常量处理,这种方式在不匹配 setter 的情况下不适用于 getter。如果仅使用 getter.
无法做到这一点,这将是我的解决方案
private final boolean legacyValue = true;
public boolean isLegacyValue() {
return legacyValue;
}
Jackson 使用 @JsonProperty
的 access
参数支持 "one-way" 属性。像这样注释你的 属性:
@JsonProperty(access = READ_ONLY)
public boolean isLegacyValue() {
return true;
}
我有一个遗产 JSON API class,我正在进化以删除某个 属性。目前,属性 值始终是相同的常量,因此我希望我的 Java 代码只是一个简单的 getter
,没有基础字段。我想继续序列化该值,直到我知道我的所有客户都已停止使用该值。该对象仅由我的客户读取,因此我不必担心他们会发送其他值。
public class MyType {
private String value;
public boolean isLegacyValue() {
return true;
}
}
就是说,如果我使用现在常量 属性 反序列化完整值,我不希望任何测试代码或类似代码失败。有没有一种方法可以让 Jackson 序列化 setter 方法 - 仅 属性,但在反序列化时忽略它?我尝试了几种不同的方法,但在反序列化时得到了 UnrecognizedPropertyException
。我宁愿不为这个 属性.
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
{"value": "ABC", "legacyValue": true}
也可以接受的方法是告诉 Jackson 包含值而不包含 Java 字段。
我知道我可以在我的 setter 之外添加一个 getter,或者将其设为一个字段,但这两个选项感觉它们混淆了 Java API,因为它实际上并不匹配常量约束:
public void setLegacyValue(boolean legacyValue) {
// No-op; only exists for Jackson deserialization
}
我发现通过反复试验可以解决的一件事是将其作为最终字段。无论出于何种原因,Jackson 都知道将其作为只写常量处理,这种方式在不匹配 setter 的情况下不适用于 getter。如果仅使用 getter.
无法做到这一点,这将是我的解决方案private final boolean legacyValue = true;
public boolean isLegacyValue() {
return legacyValue;
}
Jackson 使用 @JsonProperty
的 access
参数支持 "one-way" 属性。像这样注释你的 属性:
@JsonProperty(access = READ_ONLY)
public boolean isLegacyValue() {
return true;
}