6

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

4

2 回答 2

11

听起来您是在谈论放入@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)其余的由杰克逊负责。

于 2014-01-22T17:16:47.923 回答
0

这应该做的工作:

    List<MyObj> myList;
    
    ObjectWriter ow = mapper.writer()
            .with(SerializationFeature.WRAP_ROOT_VALUE)
            .withRootName("data");
    
    System.out.println(ow.writeValueAsString(myList));
于 2021-12-12T22:12:15.273 回答