如何通过Jackson将MyClass直接序列化为JSON数组而非对象?
问题与解决方案
问题说明
现有Java类:
class MyClass { private final List<Element> myList; public MyClass(List<Element> aList) { myList = aList; } public List<Element> getThatList() { return myList; } }
使用Dropwizard(底层依赖Jackson)序列化时,当前输出是包含thatList键的JSON对象:
{ "thatList":[ {"el1prop1":1,"el1prop2":"str1"}, {"el2prop1":2,"el2prop2":"str2"} ] }
期望直接输出该列表对应的JSON数组:
[ {"el1prop1":1,"el1prop2":"str1"}, {"el2prop1":2,"el2prop2":"str2"} ]
实现方法
方法1:用@JsonValue注解简化
直接在getThatList()方法上添加@JsonValue注解,Jackson会把这个方法的返回值作为整个对象的序列化结果,不再包装成JSON对象:
class MyClass { private final List<Element> myList; public MyClass(List<Element> aList) { myList = aList; } @JsonValue public List<Element> getThatList() { return myList; } }
这个注解的作用是标记某个方法/字段为对象的“序列化根值”,序列化时直接输出该值,而非默认的对象结构。
方法2:直接返回List(业务允许的话)
如果你的Dropwizard接口原本返回MyClass实例,可以改成直接返回getThatList()的结果(即List<Element>类型),Jackson会自动将其序列化为JSON数组:
@GET @Path("/elements") public List<Element> getElements() { List<Element> elements = // 初始化元素集合 return new MyClass(elements).getThatList(); }
方法3:自定义序列化器
如果前两种方法不适用,可以自定义序列化器来控制MyClass的序列化逻辑:
- 编写序列化器类:
public class MyClassSerializer extends StdSerializer<MyClass> { protected MyClassSerializer() { super(MyClass.class); } @Override public void serialize(MyClass value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 直接写入列表内容 gen.writeObject(value.getThatList()); } }
- 在MyClass上指定这个序列化器:
@JsonSerialize(using = MyClassSerializer.class) class MyClass { // 原有代码不变 }
内容的提问来源于stack exchange,提问作者user377486
相关产品推荐
相关产品推荐

