Java Jackson-使用根对象包装对象列表
我的控制器返回MyObj对象的列表(使用@ResponseBody) 返回的JSON如下所示:Java Jackson-使用根对象包装对象列表,java,jackson,object-object-mapping,mongo-jackson-mapper,Java,Jackson,Object Object Mapping,Mongo Jackson Mapper,我的控制器返回MyObj对象的列表(使用@ResponseBody) 返回的JSON如下所示: [{"a":1,"b":2},{"a":2,"b":2}] public final class JsonObjectWrapper { private JsonObjectWrapper() {} public static <E> Map<String, E> withLabel(String label, E wrappedObject) {
[{"a":1,"b":2},{"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);
}
}
我想包装这个JSON,这样它将返回如下内容:
{ "data": [{"a":1,"b":2},{"a":2,"b":2}]}
根据我读到的内容,我需要启用SerializationConfig.Feature.WRAP\u ROOT\u值或(?)使用
@JsonRootName(“数据”)位于我的控制器顶部
还尝试了@XmlRootElement,但似乎没有任何效果。
你知道用根名称包装对象列表的正确方法是什么吗?听起来你说的是把
@JsonRootName
放在列表上,而不是放在对象上,这不会完成你想要做的事情
如果您想使用@JsonRootName
,您需要启用序列化功能。像上面提到的那样包装\u ROOT\u VALUE
,并将注释添加到类中:
@JsonRootName("data")
public MyObj {
int a;
int b;
}
这将包装对象本身,而不是列表:
{
"listName": [
{
"data": {"a":1, "b":2}
},
{
"data": {"a":2, "b":2}
}
]
}
如果希望将列表包装到对象中,那么创建通用对象包装器可能是最好的解决方案。这可以通过以下类实现:
[{"a":1,"b":2},{"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{
私有JsonObjectWrapper(){}
带标签的公共静态映射(字符串标签,E wrappedObject){
返回集合。singletonMap(标签,wrappedObject);
}
}
然后,在您将列表与响应一起发送回之前,只需将其包装在
JsonObjectWrapper.withLabel(“data”,list)
中,其余的由Jackson处理。您知道怎么做吗?我想出了一个迂回的办法,创建一个列表映射,然后让ObjectMapper来做这件事,但这并不那么优雅。我在想有更好的办法。你找到答案了吗?也许是集合。singletonMap(标签,wrappedObject)会更高效、更体贴?很好的建议@charlie_pl!更新了帖子。