假设我有以下类:
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
类中,因为所有属性都Map到这里。所以如果你想让未知的JSON字段抛出异常,你必须自己去做。此外,如果map值可以是String以外的值,则必须进行一些手动类型检查和转换。有没有办法让Jackson自动处理这个案子?
**编辑:**我可能疯了,但这实际上似乎是工作,尽管从来没有在文档中明确提到:JsonUnwrapped
.我很确定它以前对我不起作用。尽管如此,当需要定制逻辑来封装未 Package 的多态类型时,建议的@JsonCreator
方法可能是首选。
5条答案
按热度按时间6rqinv9w1#
您可以将
@JsonCreator
与@JsonProperty
一起用于每个字段:在这种情况下,Jackson为您执行类型检查和未知字段检查。
jdzmm42g2#
它也适用于虚拟化,尽管文档中没有明确提到,就像你说的。请参阅
@JsonUnwrapped
的验证单元测试以确认-https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138lp0sw83n3#
@JsonUnwrapped
适用于序列化和非序列化,您不需要采取任何额外的步骤。5jdjgkvh4#
使用
@JsonUnwrapped
将JSON转换回Parent
类不需要更改源对象。尽管在Jackson2.13之前的Javadoc中没有提到
@JsonUnwrapped
注解,但它既适用于序列化,也适用于非序列化,因此不需要额外的配置来支持使用注解的字段的非序列化。Jackson2.13 Javadocs for
@JsonUnwrapped
阐明了注解适用于序列化和序列化:注解用于指示属性应该被序列化为“unwrapped”-也就是说,如果它将被序列化为JSON Object,则其属性将被包含为其包含Object的属性-并重新生成“缺少的”结构。
[...]
当值被格式化时,会应用“ Package ”,以便可以读回序列化的输出。
piah890a5#
对于那些像我一样在谷歌上搜索的人来说,在对unwrappepd
Map
进行封装时试图解决问题,有一个@JsonAnySetter
的解决方案: