首页 > 解决方案 > 创建一个通用 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 对象,所以它可以在没有任何强制转换的情况下进行序列化?

标签: javajava-8jackson

解决方案


我建议创建一个包含所有属性的通用类并添加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 是PersonA

if(common.getFirstName()!=null && common.getLastName()!=null)
     // Person class

if(common.getQuantity()!=null)
    // A class

推荐阅读