【问题标题】:Jackson - Wrapping a list of objects with root objectJackson - 用根对象包装对象列表
【发布时间】:2013-01-15 21:35:46
【问题描述】:

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

【问题讨论】:

  • 你有没有想过如何做到这一点?我通过创建列表映射找到了一种方法,然后让 ObjectMapper 来做这件事,但这并不是那么优雅。我在想有更好的方法来做到这一点。你弄明白了吗?

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


【解决方案1】:

听起来您是在谈论将@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) 中,其余的由 Jackson 处理。

【讨论】:

  • 也许 Collections.singletonMap(label, WrappedObject) 会更高效和简洁?
  • 很好的建议@charlie_pl!更新了帖子。
【解决方案2】:

这应该可以完成工作:

    List<MyObj> myList;
    
    ObjectWriter ow = mapper.writer()
            .with(SerializationFeature.WRAP_ROOT_VALUE)
            .withRootName("data");
    
    System.out.println(ow.writeValueAsString(myList));

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2022-01-22
    相关资源
    最近更新 更多