Джексон сериализует список в xml и json

#java #json #xml #jackson #jackson-dataformat-xml

Вопрос:

У меня есть класс, который я хочу сериализовать в json и XML:

 @JacksonXmlRootElement(localName = "devices")
class DeviceWrapper { // <-- this class is intended to provide root xml name

    @JacksonXmlProperty(localName = "device")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<Device> devices
}
 

Класс устройств-это просто POJO:

 class Device {
  String field1;
  String field2;
  ...
}
 

Сериализация DeviceWrapper в XML работает нормально:

 <?xml version="1.0"?>
<devices>
  <device>
    <field1>value</field1>
    <field2>value</field2>
  </device>
  <device>
    <field1>value</field1>
    <field2>value</field2>
  </device>
  ...
</devices>
 

но когда я пытаюсь сериализовать DeviceWrapper в json, я получаю:

 {
  "devices": [
    {
      "field1": "val",
      "field2": "val"
    },
    {
      "field1": "val",
      "field2": "val"
    }
    ...
  ]
}
 

Но я просто хочу получить список значений устройств:

 [
  {
    "field1": "val",
    "field2": "val"
  },
  {
    "field1": "val",
    "field2": "val"
  },
        ...
]
 

Т. е. я хочу видеть devices только xml в качестве элемента группировки для списка и не хочу видеть его в случае json. Как это можно сделать?

Ответ №1:

Добро пожаловать в Stack Overflow, ваша проблема будет решена List<Device> devices с @JsonValue помощью аннотации, но это невозможно из-за наличия xml-аннотаций: способ решения-использование ObjectMapper#addMixIn метода. Если вы определяете интерфейс, как показано ниже :

 public class DeviceWrapperModelMixIn {
    @JsonValue
    List<Device> devices;
}
 

Вы можете добавить его в свой objectmapper и получить ожидаемый результат без изменений в исходном коде класса:

 mapper.addMixIn(DeviceWrapper.class, DeviceWrapperModelMixIn.class);
//it prints [{"field1":"val","field2":"val"},{"field1":"val","field2":"val"}]
System.out.println(mapper.writeValueAsString(wrapper));