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); }