什么是杰克逊反序列化相当于@JsonUnwrapped?

Sha*_*aun 39 java json jackson deserialization

说我有以下课程:

public class Parent {
  public int age;
  @JsonUnwrapped
  public Name name;
}
Run Code Online (Sandbox Code Playgroud)

生成JSON:

{
  "age" : 18,
  "first" : "Joey",
  "last" : "Sixpack"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑: 我可能会疯狂,但这实际上似乎工作,尽管文档中没有明确提到:http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/ JsonUnwrapped.html
我很确定它之前对我不起作用.尽管如此,当需要自定义逻辑来反序列化未包装的多态类型时,建议的@JsonCreator方法可能更受欢迎.

hoa*_*oaz 30

您可以使用@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);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,杰克逊会为您打字检查和未知的现场检查.

  • 好点子.这确实回答了如何在JsonCreators中保留杰克逊类型/字段检查的问题,这可能是唯一有用的问题.=) (2认同)

spi*_*lok 7

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


小智 5

@JsonUnwrapped 适用于序列化和反序列化,您不需要采取任何额外的步骤。