首页 > 解决方案 > 我应该如何使用 Jackson 将包含一个对象的列表类型的对象属性转换为对象类型的属性?

问题描述

我有一个 POJO,如下所示:

public class Foo {
   private String name;
   private List<Bar> bars;
   // getters and setters
}

可能bars是空引用、包含 0 个元素的列表、包含 1 个元素的列表或包含超过 1 个元素的列表。

该对象的序列化在转换为 JSON 时将如下所示:

{
   "name: "foo",
   "bars: [{}, {}]
}

在列表包含 1 个元素的情况下,我要求在序列化时将类型bars压缩”为单个对象。JSON 表示应如下所示:

{
   "name": "foo",
   "bars": {}
}

我怎样才能使用杰克逊实现这一目标?

标签: javajackson

解决方案


经过大量挖掘文档后,我发现了 WRITE_SINGLE_ELEMENT_ARRAYS_UNWRAPPED

重写 SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED 将强制将单元素数组和集合序列化为该单元素并排除数组包装器。

实现非常简单,需要向要序列化的对象添加以下注释:@JsonFormat(with = JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED)

public class Foo {
   private String name;
   @JsonFormat(with = JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED)
   private List<Bar> bars;
   // getters and setters
}

将此注释添加到Foo后,JSON 输出为:

{
   "name": "foo",
   "bars": {}
}

推荐阅读