2013-01-31 53 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!更新了帖子。 –