具有对象类型的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
的值。