杰克逊:自定义集合序列化到JSON

Gui*_*ido 7 java json jackson

我正在尝试json序列化一个MyRootClass类,其属性是第二个类MyClass的元素集合:

public class MyRootClass {
   private List<MyInterface> list = new ArrayList<MyInterface>();
   // getter / setter
}

public class MyClass implements MyInterface {
   private String value = "test";    
   // getter / setter
}
Run Code Online (Sandbox Code Playgroud)

以下代码:

MyRootClass root = new MyRootClass();
root.getList().add(new MyClass());
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, root);
Run Code Online (Sandbox Code Playgroud)

生成此JSON输出:

{"list": [ {"value":"test"} ] }
Run Code Online (Sandbox Code Playgroud)

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

{"list": [ {"myclass": {"value":"test"}} ] }
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*Man 7

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

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

@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
Run Code Online (Sandbox Code Playgroud)

和MyClass:

@JsonTypeName("myclass")
Run Code Online (Sandbox Code Playgroud)

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

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

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