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

时间:2013-01-31 17:28:59

标签: java jackson object-object-mapping mongo-jackson-mapper

我的控制器返回一个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,似乎没什么用。 知道用根名称包装对象列表的正确方法是什么?

1 个答案:

答案 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)中,杰克逊负责其余部分。