#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));