好吧,默认情况下,杰克逊在尝试确定要为包装值显示的根名称时使用两个注释之一-
@XmlRootElement或
@JsonRootName。它希望此批注位于要序列化的类型上,否则它将使用该类型的简单名称作为根名称。
在您的情况下,您要序列化列表,这就是为什么根名称为’ArrayList’(要序列化的类型的简单名称)的原因。列表中的每个元素都可以是@JsonRootName注释的类型,但列表本身
不是 。
当您尝试包装的根值是一个集合时,则需要某种方式来定义包装名称:
支架/包装类
您可以创建一个包装器类来保存列表,并带有用于定义所需属性名称的注释( 仅当您不直接控制ObjectMapper
/
JSON转换过程时,才需要使用此方法):
class MyInterfaceList { @JsonProperty("rootname") private List<MyInterface> list; public List<MyInterface> getList() { return list; } public void setList(List<MyInterface> list) { this.list = list; }}final List<MyInterface> lists = new ArrayList<MyInterface>(4);lists.add(new MyImpl(1L, "test name"));MyInterfaceList listHolder = new MyInterfaceList();listHolder.setList(lists);final String json = mapper.writevalueAsString(listHolder);对象作家
这是更可取的选择。使用配置的
ObjectWriter实例生成JSON。我们特别对这种
withRootName方法感兴趣:
final List<MyInterface> lists = new ArrayList<MyInterface>(4);lists.add(new MyImpl(1L, "test name"));final ObjectWriter writer = mapper.writer().withRootName("rootName");final String json = writer.writevalueAsString(lists);


