【问题标题】:Create a generic JSONPatch object创建一个通用 JSONPatch 对象
【发布时间】:2020-11-30 11:33:05
【问题描述】:

我想为 Jackson 创建一个 DTO,以将我的 jsonPatch 变量序列化为 json 补丁变量。

我有这个属性来代表类Person:

  @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,这将导致转换值,这可能非常危险。

有什么方法可以告诉 Jackson 这些值来自 Person 对象或 A 对象,因此它可以在不进行任何强制转换的情况下进行序列化?

【问题讨论】:

    标签: java java-8 jackson


    【解决方案1】:

    我建议创建一个包含所有属性的通用类,并将 JsonIgnoreProperties 添加到该类中,以便 Jackson 在反序列化时忽略未知属性

    @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
    

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多