В моих API-интерфейсах на основе Restlet, используя расширение Restlet Jackson, я пытаюсь сериализовать объект Java как для XML, так и для JSON, и не могу получить ожидаемые форматы (уже существующий API уже публикует) с вложенным списком или многомерным массивом.Сериализация Java Список списков для XML и JSON с использованием Jackson
Вот мой POJO, который генерирует правильный JSON:
@JacksonXmlRootElement(localName = "table")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TableResponse {
protected List data;
protected String[] columns;
public TableResponse(String[] columns, List<List<String>> data) {
this.columns = columns;
this.data = data;
}
@JacksonXmlElementWrapper(localName = "data")
@JacksonXmlProperty(localName = "row")
//@CanIAddSomeAnnotationHereForNestedListElements?
public List<List<String>> getData() {
return data;
}
@JacksonXmlElementWrapper(localName = "columns")
@JacksonXmlProperty(localName = "column")
public String[] getColumns() {
return columns;
}
}
JSON из TableResponse, я хотел бы видеть JSON как это:
{
"data": [
[
"Row 1 Cell A",
"Row 1 Cell B"
],
[
"Row 2 Cell A",
"Row 2 Cell B"
],
[
"Row 3 Cell A",
"Row 3 Cell B"
]
],
"columns": [
"Column 1",
"Column 2"
]
}
И я бы ожидать, чтобы быть в состоянии сделать XML, как это:
<table>
<data>
<row>
<value>Row 1 Cell A</value>
<value>Row 1 Cell B</value>
</row>
<row>
<value>Row 2 Cell A</value>
<value>Row 2 Cell B</value>
</row>
<row>
<value>Row 3 Cell A</value>
<value>Row 3 Cell B</value>
</row>
</data>
<columns>
<column>Column 1</column>
<column>Column 2</column>
</columns>
</table>
Но вместо этого я получаю этот XML (XML из TableResponse), который теряет измерение:
<table>
<data>
<row>Row 1 Cell A</row>
<row>Row 1 Cell B</row>
<row>Row 2 Cell A</row>
<row>Row 2 Cell B</row>
<row>Row 3 Cell A</row>
<row>Row 3 Cell B</row>
</data>
<columns>
<column>Column 1</column>
<column>Column 2</column>
</columns>
</table>
Используя альтернативную структуру POJO, я могу получение идеальной XML-я ожидать для вложенного списка (это боль, чтобы инициализировать данные и создавать экземпляры классов для этой структуры), а затем JSON не то, что я хочу :
@JacksonXmlRootElement(localName = "table")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TableResponseForXML {
protected List data;
protected String[] columns;
public TableResponseForXML(String[] columns, List<Row> data) {
this.columns = columns;
this.data = data;
}
@JacksonXmlElementWrapper(localName = "data")
@JacksonXmlProperty(localName = "row")
public List<Row> getData() {
return data;
}
@JacksonXmlElementWrapper(localName = "columns")
@JacksonXmlProperty(localName = "column")
public String[] getColumns() {
return columns;
}
public static class Row {
private List<Value> values;
public Row(List<Value> values) {
this.values = values;
}
@JacksonXmlElementWrapper(localName = "row", useWrapping = false)
@JacksonXmlProperty(localName = "value")
public List<Value> getValues() {
return values;
}
}
public static class Value {
private String value;
public Value(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}
}
JSON из TableResponseForXML (объекты оборачивают внутренние списки):
{
"data": [
{
"values": [
"Row 1 Cell A",
"Row 1 Cell B"
]
},
{
"values": [
"Row 2 Cell A",
"Row 2 Cell B"
]
},
{
"values": [
"Row 3 Cell A",
"Row 3 Cell B"
]
}
],
"columns": [
"Column 1",
"Column 2"
]
}
Некоторые из зависимостей в моем проекте являются:
- com.fasterxml.jackson.dataformat: джексон-DataFormat-XML: 2.5.3
- org.restlet.jee: org.restlet: 2.3.5
- org.restlet.jee: орг. restlet.ext.jackson: 2.3.5
- org.restlet.jee: org.restlet.ext.json: 2.3.5
есть ли способ, чтобы сделать вложенные списки работать так, как я ожидал от JSON и XML с первой структурой POJO? Многомерный JSON Array проще работать, чем объект, обертывающий каждый список, и является существующей опубликованной спецификацией для этого API.
Заметка стороны, я также попробовал предложение в Jackson: different XML and JSON format, но не смог получить мой XmlAdapter/@ XmlJavaTypeAdapter, который будет использоваться здесь с помощью рестарта.
Я привык общаться с GSON для создания строк JSON, поэтому я могу только говорить об этом. По моему опыту, мне пришлось много экспериментировать с различными типами данных, чтобы получить то, что я хотел, и нашел, что HashMaps или LinkedHashMaps вместе с комбинацией ArrayList работал лучше всего. Возможно, вам придется поэкспериментировать с ними, чтобы увидеть результат от джексона. –
Alan