【发布时间】:2014-03-25 00:14:12
【问题描述】:
我有以下使用 Jackson 映射器映射到 POJO 的 json。如何在反序列化期间保留 json 中数组列的顺序?我应该使用什么注释?
JSON:
{
"columnNames": [
"FirstName",
"LastName",
"UserName"
],
"values": [
[
"John",
"Smith",
"jsmith"
],
[
"Tim",
"Cook",
"tcook"
]
]
}
POJO:
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"}
我是 Jackson 映射的新手,因此非常感谢任何帮助。
【问题讨论】:
-
你的反序列化器是什么样的?看起来您可能只是以错误的顺序进行反序列化。也可能是 JSON 不是您期望的顺序。
-
嗯,那么要么 JSON 出现故障,要么它们的
readValue实现具有并不总是保持有序的副作用。显然,您确实需要它们保持有序,但除了编写自定义反序列化器之外,我认为没有办法克服这个问题。我使用 GSON 库进行反序列化,编写反序列化器非常容易。不太确定您是否可以选择尝试不同的库(这取决于您编写了多少代码) -
我也检查了它,对我来说
Jackson按您的期望反序列化它。您是否使用任何自定义反序列化器或类似的东西?也许你在反序列化后不小心改变了这个列表中的顺序,不是吗? -
这是我的误解。在数组反序列化期间始终保留顺序,这是驱动 ObjectMapper 的概念。根据这个blog,ObjectMapper 实现了一个Tree Model 来表示传入的Json。树模型与 DOM 一样,在列与其值之间提供可靠的一对一映射。
标签: java jackson json-deserialization