一尘不染

什么是@JsonUnwrapped的Jackson反序列化?

json

说我有以下课程:

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

产生JSON:

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

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

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

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

编辑:
我可能疯了,但是尽管在文档中没有明确提及,但实际上这似乎可行:[http](http://fasterxml.github.io/jackson-
annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html)
//fasterxml.github.io/jackson-
annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/
JsonUnwrapped.html

我很确定以前它对我不起作用。但是,当需要自定义逻辑来反序列化未包装的多态类型时,建议的@JsonCreator方法可能是首选。

阅读 913

收藏
2020-07-27

共1个答案

一尘不染

您可以为每个字段使用@JsonCreatorwith @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会为您进行类型检查和未知字段检查。

2020-07-27