2014-04-07 51 views
9

我必須從對象列表中序列化JSON。得到的JSON有看起來像這樣:Jackson JSON List with Object Type

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

我缺少的類型/鍵「模式」的時候,我只是序列化此:

List<Model> list = new ArrayList<Model>(); // 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" 
     } 
    ] 
} 

如何爲每個對象添加「模型」而無需使用屬性「model」編寫一個愚蠢的包裝類?

我的課是這樣的:

public class Response { 
    private String status; 
    private List<Model> models; 
    // getters/setters 
} 

public class Model { 
    private Integer id; 
    private String color; 
    // getters/setters 
} 
+0

您的JSON無效;對象成員名稱必須加引號(提示:「」是一個有效的JSON對象成員名稱) – fge

+0

你可以顯示你的'Model'類和'Response'類嗎? – fge

+0

修復了thx @fge – raoulsson

回答

13

有沒有內置的方式做到這一點。你將不得不編寫自己的JsonSerializer。像

class ModelSerializer extends JsonSerializer<List<Model>> { 

    @Override 
    public void serialize(List<Model> 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<Model> models; 

這將序列化爲

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

如果你倆都序列化和反序列化這一點,你」我也需要一個自定義的解串器。

2

這是一個老氣的問題,但實現這個的說是更習慣的方法(我使用jackson-databind:2.8.8):

定義ModelSerializer(擴展StdSerializer所推薦的傑克遜),打印模型如何你喜歡和使用@JsonSerialize(contentUsing = ...)在您的收藏類型:

class ModelSerializer extends StdSerializer<Model> { 

    public ModelSerializer(){this(null);} 
    public ModelSerializer(Class<Model> t){super(t);} // sets `handledType` to the provided class 

    @Override 
    public void serialize(List<Model> value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException, 
      JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeObjectField("model", model); 
     jgen.writeEndObject(); 
    } 
} 

同時,在另一個文件:

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

現在您並不侷限於只List S的模型,但可以應用此Collection S,Set S,本土[] S和的Map S甚至價值觀。