Joh*_*ote 5 java serialization json set jackson
我有一个 Javajava.util.Set类型Comparable,我想将其按升序序列化为 JSON 数组。
有一个对象映射器功能可以序列化按映射键排序的映射,但没有提及 java 集。如果我将项目存储在java.util.SetPOJO 中,Jackson 是否会ObjectMapper以任何顺序将它们序列化为 JSON 数组?
如果没有,我正在考虑为此目的为此集编写一个自定义序列化器 - 有人可以建议更好的方法吗?
最终,目标是将唯一整数数组反序列化到“请求”pojo 中的某种容器中。然后处理请求并将该输入字段传递到“响应”对象中相应的输出字段(不变)。
我想将数据存储在 POJO 中,只是java.util.Set<Integer>为了让所有用户满意(如果您尝试将其存储为 POJO 接口的子类型,Set那么 POJO 界面的消费者可能会感到不安,因为他们不仅不能获取,Set而且还必须期望 aHashSet或 a TreeSet)。
这行得通吗?
[5,4,3,2,1]被反序列化为BUT,我在 setter 方法上Set<Integer>使用。@JsonDeserialize(as=TreeSet.class)所以对象的运行时类型现在是 a TreeSet(即使它作为 a 存储在 POJO 中Set)。Set并最终存储在响应 POJO 中(运行时类型仍然是TreeSet,即使 POJO 字段类型是 Set )。ObjectMapper将一个TreeSetJSON 数组序列化[1,2,3,4,5](因为TreeSet是自然排序的)。上面的第 3 项是我想知道的 - 将ObjectMapper使用 POJO 字段的运行时类型,还是声明的类型?
如何确保我的Set数据按排序顺序转换为 JSON 数组?
JSON数组是一个有序集合,就像 Java 数组一样:
数组是值的有序集合。数组以
[(左括号)开始,以(右括号)结束]。值由(逗号)分隔,。
然而,有序并不意味着排序。它只是意味着它保留给定值的顺序:
如果Set已排序(例如),则根据 的排序顺序对TreeSetJSON 数组进行排序Set:
TreeSet:元素使用其自然顺序进行排序,或者通过Comparator在设置创建时提供的顺序进行排序,具体取决于使用的构造函数。
如果Set是无序的(例如HashSet),则 JSON 数组采用 .返回的任意Set顺序。
HashSet:它不保证集合的迭代顺序;特别是,它不保证顺序随着时间的推移保持不变。
这与JSON对象的字段不同:
对象是一组无序的名称/值对。对象以(左大括号)开始并以(右大括号)结束。每个名称后跟(冒号),名称/值对之间用(逗号)分隔。
{}:,