Джексон - Завершение списка объектов с корневым объектом
Мой контроллер возвращает список объектов 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, кажется, ничего не работает. Любая идея, как правильно обернуть список объектов с корневым именем?
2 ответа
Похоже, вы говорите о @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)
а Джексон позаботится обо всем остальном.
Это должно сделать работу:
List<MyObj> myList;
ObjectWriter ow = mapper.writer()
.with(SerializationFeature.WRAP_ROOT_VALUE)
.withRootName("data");
System.out.println(ow.writeValueAsString(myList));