杰克逊 - 用根对象包装对象列表

use*_*427 6 java jackson object-object-mapping mongo-jackson-mapper

我的Controller返回一个MyObj对象列表(使用@ResponseBody)

public MyObj 
{
   int a;
   int b;
}
Run Code Online (Sandbox Code Playgroud)

返回JSON如下所示:

[{"a":1,"b":2},{"a":2,"b":2}]
Run Code Online (Sandbox Code Playgroud)

我想包装这个JSON,所以它将返回如下内容:

{ "data": [{"a":1,"b":2},{"a":2,"b":2}]}
Run Code Online (Sandbox Code Playgroud)

从我读到的我需要启用SerializationConfig.Feature.WRAP_ROOT_VALUE或(?)在我的控制器上使用@JsonRootName("data").

还尝试了@XmlRootElement,似乎没什么用.知道用根名称包装对象列表的正确方法是什么?

Sam*_*rry 9

这听起来像是在谈论放在@JsonRootName列表而不是对象,这将无法完成你想要做的事情.

如果你想使用@JsonRootName你想要SerializationFeature.WRAP_ROOT_VALUE像上面提到的那样启用并将注释添加到类中:

@JsonRootName("data")
public MyObj {
    int a;
    int b;
}
Run Code Online (Sandbox Code Playgroud)

这将包装对象本身,而不是列表:

{
    "listName": [
        {
            "data": {"a":1, "b":2}
        },
        {
            "data": {"a":2, "b":2}
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果要将列表包装在对象中,则创建通用对象包装器可能是最佳解决方案.这可以通过以下类完成:

public final class JsonObjectWrapper {
    private JsonObjectWrapper() {}

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

然后在您将回复列表发回之前,将其包装好JsonObjectWrapper.withLabel("data", list),杰克逊负责其余部分.