@JsonUnwrapped 的 Jackson 反序列化等价物是啥?
Posted
技术标签:
【中文标题】@JsonUnwrapped 的 Jackson 反序列化等价物是啥?【英文标题】:What's the Jackson deserialization equivalent of @JsonUnwrapped?@JsonUnwrapped 的 Jackson 反序列化等价物是什么? 【发布时间】:2013-05-10 07:43:00 【问题描述】:假设我有以下课程:
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://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html 我很确定它以前对我不起作用。尽管如此,当需要自定义逻辑来反序列化解包的多态类型时,建议的@JsonCreator 方法可能更受欢迎。
【问题讨论】:
您确定@JsonUnwrapped
正在为反序列化工作吗?我刚刚尝试过,当我尝试反序列化扁平化的 JSON 时收到 Could not read JSON: Unrecognized field...
错误。
【参考方案1】:
您可以为每个字段使用@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 会为您进行类型检查和未知字段检查。
【讨论】:
好点。这确实回答了如何在 JsonCreators 中保留杰克逊类型/字段检查的问题,这可能是剩下的唯一有用的问题。 =)【参考方案2】:对于像我一样在这里用谷歌搜索的人,试图在反序列化 unwrapepd Map
时解决问题,@JsonAnySetter
有一个解决方案:
public class CountryList
Map<String, Country> countries = new HashMap<>();
@JsonAnySetter
public void setCountry(String key, Country value)
countries.put(key, value);
【讨论】:
【参考方案3】:它也适用于反序列化,尽管文档中没有明确提到它,就像你说的那样。请参阅此处的 @JsonUnwrapped
反序列化单元测试进行确认 - https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138
【讨论】:
【参考方案4】:@JsonUnwrapped
适用于序列化和反序列化,您不需要采取任何额外的步骤。
【讨论】:
【参考方案5】:尽管在现有版本的 Javadocs 中没有提及,@JsonUnwrapped
注释确实适用于反序列化和序列化,因此不需要额外的工作来支持反序列化。
虽然文档更新尚未发布(截至 2021 年 2 月 5 日),但 Javadocs 正在更新以阐明@JsonUnwrapped
注释适用于反序列化和序列化(根据
jackson-annotations#184)。
用于指示属性应该被序列化“解包”的注解——也就是说,如果它将被序列化为 JSON 对象,它的属性将被包含为其包含对象的属性——并且反序列化再现“缺失”结构.
[...]
当值被反序列化时,应用“包装”,以便可以读回序列化的输出。
【讨论】:
以上是关于@JsonUnwrapped 的 Jackson 反序列化等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章