我正在使用Jackson对对象列表进行JSON序列化。
这是我得到的:
{"ArrayList":[{"id":1,"name":"test name"}]}
但是我想要这个:
{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.
下面是我的处理方法:
接口:
public interface MyInterface { public long getId(); public String getName(); }
实现类:
@JsonRootName(value = "rootname") public class MyImpl implements MyInterface { private final long id; private String name; public MyImpl(final long id,final name) { this.id = id; this.name = name; } // getters }
JSon序列化:
public class MySerializer { public static String serializeList(final List<MyInterface> lists) { //check for null value.Throw Exception final ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true); return mapper.writeValueAsString(lists); } }
测试:
final List<MyInterface> list = new ArrayList<MyImpl>(); MyImpl item = new MyImpl(1L,"test name"); list.add(item); final String json = MySerializer.serializeList(list); System.out.println(json);
还是我错过了什么?我为此使用杰克逊1.9.12。欢迎在这方面提供任何帮助。
好吧,默认情况下,杰克逊在尝试确定要为包装值显示的根名称时使用两个注释之一- @XmlRootElement或@JsonRootName。它希望此批注位于要序列化的类型上,否则它将使用该类型的简单名称作为根名称。
@XmlRootElement
@JsonRootName
在您的情况下,您要序列化列表,这就是为什么根名称为’ArrayList’(要序列化的类型的简单名称)的原因。列表中的每个元素都可以是@JsonRootName注释的类型,但列表本身 不是 。
当您尝试包装的根值是一个集合时,则需要某种方式来定义包装名称:
您可以创建一个包装器类来保存列表,并带有用于定义所需属性名称的注释( 仅当您不直接控制ObjectMapper/ JSON转换过程时,才需要使用此方法):
ObjectMapper
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方法感兴趣:
ObjectWriter
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);