jackson:自定义集合序列化到JSON

我试图json序列化一个类MyRootClass与一个属性,该属性是第二个类MyClass的元素的集合:

public class MyRootClass { private List list = new ArrayList(); // getter / setter } public class MyClass implements MyInterface { private String value = "test"; // getter / setter } 

以下代码:

 MyRootClass root = new MyRootClass(); root.getList().add(new MyClass()); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(System.out, root); 

生成此JSON输出:

 {"list": [ {"value":"test"} ] } 

而不是我需要的,集合中的每个对象都用一个名称序列化:

 {"list": [ {"myclass": {"value":"test"}} ] } 

有没有办法用Jackson实现它? 我考虑过编写一个自定义序列化程序,但是我找不到任何与对象集合相关的东西。

这取决于你想用名字实现什么; 但是,如果你想在这里包含’myclass’是类型信息(或者可以表现得好像它被使用;如果你不使用Jackson反序列化它并不重要),这可以做到。

如果是这样,您将注释MyInterface:

 @JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT) 

和MyClass:

 @JsonTypeName("myclass") 

(如果没有定义,默认名称将是类的非限定名称)

上面的@JsonTypeInfo定义了要使用的类型名称(而不是Java类名或自定义方法),并且使用包装器对象完成包含(替代方法是包装器数组和as-property)

那么你应该看到预期的输出。

你想要的是在输出中包含类的名称。 这不是json序列化程序的行为方式 – 它们只包含字段名称。

你能做的是介绍另一堂课。

 class MyClass implements MyInterface { private MyOtherClass myclass; } class MyOtherClass { private String value = "test"; } 

您可以使用这样的辅助对象:

 public static class MyObject { public int i; public MyObject(int i) { this.i = i; } public MyObject() {} } @JsonDeserialize(contentAs=MyObject.class) public static class MyHelperClass extends ArrayList { } @Test public void testCollection() throws JsonGenerationException, JsonMappingException, IOException { final Collection l = new ArrayList(); l.add(new MyObject(1)); l.add(new MyObject(2)); l.add(new MyObject(3)); final ObjectMapper mapper = new ObjectMapper(); final String s = mapper.writeValueAsString(l); final Collection back = mapper.readValue(s, MyHelperClass.class); }