2013-01-31 112 views
5

我的控制器對象的列表返回MyObj中的對象(@ResponseBody使用)的列表- 傑克遜用包裝紙根對象

public MyObj 
{ 
    int a; 
    int b; 
} 

返回JSON看起來是這樣的:

[{"a":1,"b":2},{"a":2,"b":2}] 

我想包裝這個JSON所以它會返回類似於:

{ "data": [{"a":1,"b":2},{"a":2,"b":2}]} 

從我讀我需要啓用SerializationCon或者(?)在我的控制器上使用 @JsonRootName(「data」)。

也試過@XmlRootElement,似乎沒有任何工作。 任何想法用根名稱包裝對象列表的正確方法是什麼?

+1

你有沒有想過如何做到這一點?我通過創建列表映射想出了一個圓的方法,然後讓ObjectMapper做它的事情,但那不是那麼優雅。我想有更好的方法來做到這一點。你弄明白了嗎? – Seagull

回答

6

聽起來好像你在談論把@JsonRootName放在列表上而不是對象上,這樣做不會完成你想要做的事情。

如果你想使用@JsonRootName你要啓用SerializationFeature.WRAP_ROOT_VALUE像你上面提到的和註釋添加到類:

@JsonRootName("data") 
public MyObj { 
    int a; 
    int b; 
} 

這將包裝對象本身,名單:

{ 
    "listName": [ 
     { 
      "data": {"a":1, "b":2} 
     }, 
     { 
      "data": {"a":2, "b":2} 
     } 
    ] 
} 

如果你想要將列表包裝在一個對象中,可能創建一個通用對象包裝器是最好的解決方案。這可以用這樣一個類來完成:

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

    public static <E> Map<String, E> withLabel(String label, E wrappedObject) { 
     return Collections.singletonMap(label, wrappedObject); 
    } 
} 

然後你把你的清單回來的響應之前,只是把它包在JsonObjectWrapper.withLabel("data", list)和傑克遜負責剩下的照顧。

+0

也許Collections.singletonMap(label,wrappedObject)會更有效率和consise? –

+0

偉大的建議@charlie_pl!更新了帖子。 –