десериализация массива json в список и сохранение порядка массива из json в списке

У меня есть следующий json, который сопоставляется с POJO с помощью картографа Jackson. Как сохранить порядок столбцов массива из json во время десериализации? Какую аннотацию следует использовать?

JSON:

{
"columnNames": [
   "FirstName",
   "LastName",
   "UserName"
],
"values": [
    [
        "John",
        "Smith",
        "jsmith"
    ],
    [
        "Tim",
        "Cook",
        "tcook"
    ]
]

}

ПОЖО:

public class Data implements Serializable {

private List<String> columnNames = new ArrayList<String>();

private List<ArrayList<String>> values = new ArrayList<ArrayList<String>>();

public List<String> getColumnNames() {
    return columnNames;
}

public void setColumnNames(List<String> columnNames) {
    this.columnNames = columnNames;
}

public List<ArrayList<String>> getValues() {
    return values;
}

public void setValues(List<ArrayList<String>> values) {
    this.values = values;
}

}

  • Ожидаемые getColumnNames(): {"FirstName","LastName","UserName"}
  • Фактические getColumnNames(): {"UserName","FirstName","LastName"}

Я новичок в отображении Джексона, поэтому любая помощь приветствуется.


person Sensei    schedule 25.03.2014    source источник
comment
Как выглядит ваш десериализатор? Похоже, вы просто десериализуете в неправильном порядке. Также может случиться так, что JSON находится не в том порядке, в котором вы ожидаете.   -  person Aarowaim    schedule 25.03.2014
comment
Хм, тогда либо JSON вышел из строя, либо их реализация readValue имеет побочный эффект, заключающийся в том, что он не всегда остается в порядке. Очевидно, вам нужно, чтобы они оставались в порядке, но, кроме написания собственного десериализатора, я не думаю, что есть способ преодолеть это. Я использовал библиотеку GSON для десериализации, и писать десериализаторы было довольно легко. Не совсем уверен, есть ли у вас возможность попробовать другую библиотеку (это зависит от того, сколько кода вы написали)   -  person Aarowaim    schedule 25.03.2014
comment
Я также проверил это и для меня Jackson десериализовал его, как вы ожидаете. Используете ли вы какой-либо пользовательский десериализатор или что-то в этом роде? Может быть, вы случайно меняете порядок в этом списке после десериализации, не так ли?   -  person Michał Ziober    schedule 25.03.2014
comment
Это было недоразумением с моей стороны. Порядок всегда сохраняется во время десериализации массива, что является концепцией, лежащей в основе ObjectMapper. Согласно этому блогу, ObjectMapper реализует древовидную модель для представления входящий Json. Модель дерева, как и DOM, предлагает надежное сопоставление один на один между столбцом и его значениями.   -  person Sensei    schedule 26.03.2014


Ответы (1)


Сопоставитель Джексона заполняет ArrayList, сохраняя порядок JSON. Если вам нужен другой порядок, вы можете использовать аннотацию @JsonPropertyOrder.

(http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonPropertyOrder.html)

person Francesco Lo Cascio    schedule 30.03.2016