具有对象类型的Jackson JSON列表

我必须从对象列表中序列化JSON。 生成的JSON必须如下所示:

{ "status": "success", "models": [ { "model": { "id": 23, "color": "red" } }, { "model": { "id": 24, "color": "green" } } ] } 

当我简单地序列化时,我错过了类型/键“模型”:

 List list = new ArrayList(); // add some new Model(...) Response r = new Response("success", list); // Response has field "models" 

相反,我得到这个:

 { "status": "success", "models": [ { "id": 23, "color": "red" }, { "id": 24, "color": "green" } ] } 

如何为每个对象添加“模型”而无需编写具有属性“模型”的愚蠢包装类?

我的课程看起来像这样:

 public class Response { private String status; private List models; // getters / setters } public class Model { private Integer id; private String color; // getters / setters } 

没有内置的方法来做到这一点。 你必须编写自己的JsonSerializer 。 就像是

 class ModelSerializer extends JsonSerializer> { @Override public void serialize(List value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartArray(); for (Model model : value) { jgen.writeStartObject(); jgen.writeObjectField("model", model); jgen.writeEndObject(); } jgen.writeEndArray(); } } 

然后注释models字段,以便它使用它

 @JsonSerialize(using = ModelSerializer.class) private List models; 

这将序列化为

 { "status": "success", "models": [ { "model": { "id": 1, "color": "red" } }, { "model": { "id": 2, "color": "green" } } ] } 

如果您同时序列化和反序列化,那么您还需要一个自定义反序列化器。

这是一个古老的问题,但有一种可以说是更为惯用的实现方式(我使用的是jackson-databind:2.8.8 ):

定义一个ModelSerializer (根据Jackson的推荐扩展StdSerializer ),打印您的模型,并在您的集合类型上使用@JsonSerialize(contentUsing = ...)

 class ModelSerializer extends StdSerializer { public ModelSerializer(){this(null);} public ModelSerializer(Class t){super(t);} // sets `handledType` to the provided class @Override public void serialize(List value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeObjectField("model", value); jgen.writeEndObject(); } } 

同时,在另一个文件中:

 class SomethingWithModels { // ... @JsonSerialize(contentUsing = ModelSerializer.class) private Collection models; // ... } 

现在你不仅仅是List的模型,而是可以将它应用于Collection s, Set s,Native [] s甚至是Map的值。