我的控制器返回一个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}]}
从我读到的我需要启用SerializationConfig.Feature.WRAP_ROOT_VALUE或(?)使用 @JsonRootName(“data”)位于我的控制器之上。
还尝试了@XmlRootElement,似乎没什么用。 知道用根名称包装对象列表的正确方法是什么?
答案 0 :(得分:9)
听起来你正在谈论将@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)
中,杰克逊负责其余部分。