在同一字段上读取和写入的不同@JsonProperty 配置?
Different @JsonProperty config for READ and WRITE on same field?
我有一个class(不能修改)像
public class Standing {
private Integer positionNumber;
private String positionText;
private BigDecimal points;
..
}
反序列化时,我得到如下数据:
{
"position": "1",
"points": 10
}
因为我无法修改 Standing
class 我有一个混入:
@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
String positionText;
}
由于收到的 json 没有 positionNumber
和 positionText
字段,我使用 @JsonPropery
注释。
对于 Access.READ_ONLY
我只是忽略了 positionNumber
字段。
并且在 positionText
字段上使用 @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
,我确保它在反序列化期间填充了 json 中的 position
字段。
这在反序列化过程中效果很好。
注意 StandingSanitizer
设置 positionNumber
。这是因为接收到的 position
值可以是非数字值,例如 DSQ
,在这种情况下,positionNumber
字段将为 null
.
但是在序列化时我想输出 Standing
class 中的所有 3 个字段,例如:
{
"positionText": "1",
"positionNumber": 1,
"points": 10
}
但是由于 positionText
字段上的 @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
,不幸的是它没有序列化。
理论上我想做类似的事情:
@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
String positionText;
}
我可以为 READ 和 WRITE 使用不同的 @JsonProperty
注释。
但这是不可能的,因为不允许在字段上重复 @JsonProperty
注释;据我所知,不支持可重复注释。
有没有其他办法解决这个问题?
我能想到的一件事是有 2 个 ObjectMapper
个实例,有 2 个不同的 StandingMixIns
; 1 个用于反序列化,1 个用于序列化。但我更愿意保留 1 个 ObjectMapper
实例,因此使用 2 是最后的选择。
您可以使用 getter 和 setter 来获得额外的自定义。 get 将充当 READ,set 将充当 WRITE。请注意,您不需要访问属性或字段级注释:
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
// No annotation on the field
String positionText;
@JsonProperty(value = "positionText")
public String getPositionText() {
return positionText;
}
@JsonProperty(value = "position")
public void setPositionText(String positionText) {
this.positionText = positionText;
}
}
谢谢@Franjavi,您确实是对的,我应该在 getters/setters 上使用注释,而不仅仅是在字段上。我只专注于使用字段,因为我的混合 classes 是用隐式 getters/setters.
在 Groovy 中编写的
我将 class 精简了一点,只剩下:
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(value = "positionText")
public abstract String getPositionText();
@JsonProperty(value = "position")
public abstract void setPositionText(String positionText);
}
(完全删除 positionText
并使用抽象方法)
我有一个class(不能修改)像
public class Standing {
private Integer positionNumber;
private String positionText;
private BigDecimal points;
..
}
反序列化时,我得到如下数据:
{
"position": "1",
"points": 10
}
因为我无法修改 Standing
class 我有一个混入:
@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
String positionText;
}
由于收到的 json 没有 positionNumber
和 positionText
字段,我使用 @JsonPropery
注释。
对于 Access.READ_ONLY
我只是忽略了 positionNumber
字段。
并且在 positionText
字段上使用 @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
,我确保它在反序列化期间填充了 json 中的 position
字段。
这在反序列化过程中效果很好。
注意 StandingSanitizer
设置 positionNumber
。这是因为接收到的 position
值可以是非数字值,例如 DSQ
,在这种情况下,positionNumber
字段将为 null
.
但是在序列化时我想输出 Standing
class 中的所有 3 个字段,例如:
{
"positionText": "1",
"positionNumber": 1,
"points": 10
}
但是由于 positionText
字段上的 @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
,不幸的是它没有序列化。
理论上我想做类似的事情:
@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
String positionText;
}
我可以为 READ 和 WRITE 使用不同的 @JsonProperty
注释。
但这是不可能的,因为不允许在字段上重复 @JsonProperty
注释;据我所知,不支持可重复注释。
有没有其他办法解决这个问题?
我能想到的一件事是有 2 个 ObjectMapper
个实例,有 2 个不同的 StandingMixIns
; 1 个用于反序列化,1 个用于序列化。但我更愿意保留 1 个 ObjectMapper
实例,因此使用 2 是最后的选择。
您可以使用 getter 和 setter 来获得额外的自定义。 get 将充当 READ,set 将充当 WRITE。请注意,您不需要访问属性或字段级注释:
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
// No annotation on the field
String positionText;
@JsonProperty(value = "positionText")
public String getPositionText() {
return positionText;
}
@JsonProperty(value = "position")
public void setPositionText(String positionText) {
this.positionText = positionText;
}
}
谢谢@Franjavi,您确实是对的,我应该在 getters/setters 上使用注释,而不仅仅是在字段上。我只专注于使用字段,因为我的混合 classes 是用隐式 getters/setters.
在 Groovy 中编写的我将 class 精简了一点,只剩下:
public abstract class StandingMixIn {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
Integer positionNumber;
@JsonProperty(value = "positionText")
public abstract String getPositionText();
@JsonProperty(value = "position")
public abstract void setPositionText(String positionText);
}
(完全删除 positionText
并使用抽象方法)