gpt4 book ai didi

java - Jackson ObjectMapper : Can java. util.Set 按升序序列化为 JSON 数组?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:53 24 4
gpt4 key购买 nike

我有一个 Java java.util.Set Comparable 我希望按升序序列化为 JSON 数组的类型。

有一个对象映射器功能可以序列化按映射键排序的映射,但没有提到 Java 集。如果我将元素存储在 java.util.Set 中在我的 POJO 中,将 Jackson ObjectMapper以任何顺序将它们序列化为 JSON 数组?

如果没有,我正在考虑为此目的为集合编写一个自定义序列化程序 - 有人可以建议有更好的方法吗?


最终,目标是将唯一整数数组反序列化为“请求”pojo 中的某种容器。然后处理请求并将该输入字段传递到“响应”对象中相应的输出字段(未更改)。

我想将 POJO 中的数据存储为 java.util.Set<Integer>只是为了让所有用户满意(如果您尝试将其存储为 Set 的子类型,那么 POJO 界面的消费者可能会因为他们不能只获得 Set 而必须期待 HashSet 或一个 TreeSet )。

这行得通吗?

  1. JSON 数组 [5,4,3,2,1]被反序列化为 Set<Integer>但是,我使用 @JsonDeserialize(as=TreeSet.class)在setter方法上。所以对象的运行时类型现在是 TreeSet (即使它作为 Set 存储在 POJO 中)。
  2. Set通过服务器传递并最终结束存储在响应 POJO 中(运行时类型仍然是 TreeSet ,即使 POJO 字段类型是 Set)。
  3. ObjectMapper序列化 TreeSet到 JSON 数组 [1,2,3,4,5] (因为 TreeSet 是自然排序的)。

上面的第 3 项是我想知道的 - will ObjectMapper使用 POJO 字段的运行时类型,还是声明的类型?


如何确保我的 Set是否按排序顺序转换为 JSON 数组?

最佳答案

A JSON数组是一个有序集合,就像 Java 数组一样:

An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).

但是,已排序 并不意味着已排序。这只是意味着它保留给定值的顺序:

  • 如果 Set 已排序(例如 TreeSet),则 JSON 数组将排序,根据的排序顺序集合:

    TreeSet: The elements are ordered using their natural ordering, or by a Comparator provided at set creation time, depending on which constructor is used.

  • 如果 Set 是无序的(例如 HashSet),则 JSON 数组按 任意 顺序由 设置

    HashSet: It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.

这不同于 JSON字段对象:

An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).

关于java - Jackson ObjectMapper : Can java. util.Set 按升序序列化为 JSON 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com