当前位置: 首页 > 面试题库 >

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

刘升
2023-03-14
问题内容

说我有以下课程:

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方法可能是首选。

问题答案:

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



 类似资料:
  • 假设我有以下课程: 生成JSON: 如何将其反序列化回父类?我可以使用@JsonCreator 但这也有效地向父类添加了JsonIgnoreProperties(ignoreUnknown=true),因为所有属性都映射到这里。因此,如果希望未知JSON字段引发异常,则必须自己进行。此外,如果映射值可能不是字符串,则必须进行一些手动类型检查和转换。杰克逊有没有办法自动处理这个案子? 编辑:我可能有

  • 本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。    

  • 我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化

  • 我对Jackson有一个错误的理解,就是将json文件反序列化为poco。这是我的代码: 我的POCO命名为AnimalBean: }还有我的JSON文件: } 当我执行我的代码时,我有以下错误:未识别的字段“动物园”(类动画豆),未标记为可忽略的。我知道问题是我的json文件开始不直接由动物,但我不能改变它,因为它不是我的。我已经尝试把对象apper.configure(Deseriazatio

  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。 以下是JSON的响应: 我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。 当我执行如下readTree时: 它到达了反序列化方法,看起来它只有一个节点,而不是下面