【问题标题】:deserialization of a json array to a list and retaining the array order from json within list将 json 数组反序列化为列表并在列表中保留 json 中的数组顺序
【发布时间】: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


【解决方案1】:

Jackson 映射器填充 ArrayList,保持 JSON 的顺序。如果你想要不同的顺序,你可以使用注解@JsonPropertyOrder。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2016-12-29
    • 2017-10-02
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多