Jackson 的反序列化相当于 @JsonUnwrapped?

2022-08-31 17:21:01

假设我有以下类:

public class Parent {
  public int age;
  @JsonUnwrapped
  public Name name;
}

生成 JSON:

{
  "age" : 18,
  "first" : "Joey",
  "last" : "Sixpack"
}

如何将其反序列化回父类?我可以使用@JsonCreator

@JsonCreator
public Parent(Map<String,String> jsonMap) {
  age = jsonMap.get("age");
  name = new Name(jsonMap.get("first"), jsonMap.get("last"));
}

但这也有效地添加到了 Parent 类,因为所有属性都映射到此处。因此,如果您希望未知的JSON字段引发异常,则必须自己执行此操作。此外,如果映射值可能不是字符串,则必须执行一些手动类型检查和转换。杰克逊有没有办法自动处理这个案件?@JsonIgnoreProperties(ignoreUnknown=true)

编辑:我可能疯了,但实际上这似乎有效,尽管文档中从未明确提及:http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
我非常确定它以前对我不起作用。尽管如此,当需要自定义逻辑来反序列化未包装的多态类型时,所提出的@JsonCreator方法可能是首选。


答案 1

您可以对每个字段使用 with:@JsonCreator@JsonProperty

@JsonCreator
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName,
        @JsonProperty("lastName") String lastName) {
    this.age = age;
    this.name = new Name(firstName, lastName);
}

在这种情况下,Jackson 会为您执行类型检查和未知字段检查。


答案 2

它确实也适用于反序列化,尽管像你说的那样,文档中没有明确提到它。有关确认,请参阅此处的反序列化单元测试 - https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138@JsonUnwrapped