Джексон - Завершение списка объектов с корневым объектом

Мой контроллер возвращает список объектов 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));
Другие вопросы по тегам