java - 同一字段上的 READ 和 WRITE 的不同 @JsonProperty 配置?
问题描述
我有一个类(不能修改),比如
public class Standing {
private Integer positionNumber;
private String positionText;
private BigDecimal points;
..
}
反序列化时,我得到如下数据:
{
"position": "1",
"points": 10
}
由于我无法修改Standing
课程,因此我有一个混合类,例如:
@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
领域。
在字段@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
上,positionText
我确保它position
在反序列化期间填充了来自 json 的字段。
这在反序列化期间效果很好。
注意StandingSanitizer
集合positionNumber
。这是因为接收到的position
值可以是非数字值,DSQ
在这种情况下,该positionNumber
字段将为null
.
但是在序列化时,我想从Standing
类中输出所有 3 个字段,例如:
{
"positionText": "1",
"positionNumber": 1,
"points": 10
}
但不幸的是,由于@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
在positionText
现场它没有被序列化。
从理论上讲,我想做一些类似的事情:
@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;
}
我可以@JsonProperty
对 READ 和 WRITE 使用不同的注释。
但这是不可能的,因为@JsonProperty
不允许在字段上重复注释;据我所知,不支持可重复的注释。
有没有其他解决方案来解决这个问题?
我能想到的一件事是有 2 个ObjectMapper
实例,有 2 个不同的StandingMixIns
;1 用于反序列化,1 用于序列化。但我宁愿继续拥有 1 个ObjectMapper
实例,所以使用 2 将是最后的手段。
解决方案
谢谢@Franjavi,你确实是对的,我应该在 getter/setter 上使用注释,而不仅仅是在字段上。我只专注于使用字段,因为我的混合类是用 Groovy 编写的,带有隐式的 getter/setter。
我把班级精简了一点,只是:
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
并使用抽象方法)
推荐阅读
- python - Flutter / Dart 没有从本地托管的烧瓶 api 返回值
- mysql - 获得最后评论文章的最佳查询是什么?
- html - 相对于图像定位元素
- c++ - c++17中的双向静态值映射
- r - 在 R 中使用配方后如何对变量进行非规范化(反向转换)?
- javascript - 我为我的网站添加了一个 Lightbox jquery,但我想删除每次出现的蓝色边框
- nativescript - 如何使用在其详细信息页面上发生的更改立即更新母版页的组件?
- c - 如何在循环中声明分配的数组?
- visual-studio - Visual Studio Code - 无法上传在我的计算机上本地创建的 nuget 包
- python - 如何在 python 中的 SQL 中使用列名编写表输出?