Jackson化与@JsonUnwrapped的等价物是什么?

wfsdck30  于 2023-10-20  发布在  其他
关注(0)|答案(5)|浏览(143)

假设我有以下类:

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

6rqinv9w

6rqinv9w1#

您可以将@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为您执行类型检查和未知字段检查。

jdzmm42g

jdzmm42g2#

它也适用于虚拟化,尽管文档中没有明确提到,就像你说的。请参阅@JsonUnwrapped的验证单元测试以确认-https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138

lp0sw83n

lp0sw83n3#

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

5jdjgkvh

5jdjgkvh4#

使用@JsonUnwrapped将JSON转换回Parent类不需要更改源对象。
尽管在Jackson2.13之前的Javadoc中没有提到@JsonUnwrapped注解,但它既适用于序列化,也适用于非序列化,因此不需要额外的配置来支持使用注解的字段的非序列化。
Jackson2.13 Javadocs for @JsonUnwrapped阐明了注解适用于序列化和序列化:
注解用于指示属性应该被序列化为“unwrapped”-也就是说,如果它将被序列化为JSON Object,则其属性将被包含为其包含Object的属性-并重新生成“缺少的”结构。
[...]
当值被格式化时,会应用“ Package ”,以便可以读回序列化的输出。

piah890a

piah890a5#

对于那些像我一样在谷歌上搜索的人来说,在对unwrappepd Map进行封装时试图解决问题,有一个@JsonAnySetter的解决方案:

public class CountryList
{

    Map<String, Country> countries = new HashMap<>();

    @JsonAnySetter
    public void setCountry(String key, Country value)
    {
        countries.put(key, value);
    }

}

相关问题