java - 创建一个通用 JSONPatch 对象
问题描述
我想为 Jackson 创建一个 DTO,以将我的 jsonPatch 变量序列化为 json 补丁变量。
我有这个属性来表示类人:
@JsonProperty("lastName")
private String lastName;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("age")
private int age;
@JsonProperty("a")
private A classA;
A类也有:
@JsonProperty("colour")
private String colour;
@JsonProperty("quantity")
private BigDecimal quantity;
我创建的 DTO 是这样的:
@JsonProperty("path")
protected String path;
@JsonProperty("op")
protected String operation;
@JsonProperty("value")
protected Object values;
我收到的 json 补丁可以在值类上具有 Person 或 A 类:
个人补丁:
[
{
"value":
{
"lastName": "Doe",
"firsName": "John"
},
"path": /people",
"op": "replace"
}
]
A的补丁:
[
{
"value":
{
"quantity": 12.1,
},
"path": /A",
"op": "remove"
}
]
正如我告诉你的,值可以是 Person 或 A 类,这就是为什么值是 Object 类的原因。
我的问题是当 Jackson 序列化来自 Person 的值时,它序列化为 Map,而当值来自对象 A 时,它序列化为 double,这将导致转换值,这可能非常危险。
有没有办法告诉杰克逊这些值来自 Person 对象或来自 A 对象,所以它可以在没有任何强制转换的情况下进行序列化?
解决方案
我建议创建一个包含所有属性的通用类并添加JsonIgnoreProperties
到该类中,以便杰克逊在反序列化时忽略未知属性
@JsonIgnoreProperties(ignoreUnknown = true)
class Common {
@JsonProperty("colour")
private String colour;
@JsonProperty("quantity")
private BigDecimal quantity;
@JsonProperty("lastName")
private String lastName;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("age")
private int age;
@JsonProperty("a")
private A classA;
}
然后在将 JSON 反序列化为Common
对象后,只需null
检查以识别反序列化的 JSON 是Person
或A
类
if(common.getFirstName()!=null && common.getLastName()!=null)
// Person class
if(common.getQuantity()!=null)
// A class
推荐阅读
- azure - Azure ARM 错误“ResourceReferenceUsesWrongSubscriptionId”
- curl - telnet 后关闭 curl 连接
- r - pdp plotPartial 无法更改 zlim
- c# - 如何在 xaml 和 wpf 中将菜单项与 observableCollection 绑定?
- c++ - C++ 使用参数返回指针 - 不同指针类型之间的比较缺少强制转换
- graphql - 将 graphql 发送到 Restsharp 自动化中的 Post 正文
- powershell - Powershell 构建损坏的路径
- c# - Blazor 获取对单击元素的引用
- firebase - Unity Firebase Crashlytics 未发送任何崩溃报告,在 logcat 上出现“无法检索设置”错误
- jfreechart - 如何在 JFreeChart 中显示价格下跌的交叉线和红色?