Jackson ObjectMapper:java.util.Set能否按升序顺序序列化为JSON数组?
我有一个Java类型,我希望以升序排序的顺序将其序列化为JSON数组 有一个对象映射器特性可以序列化按映射键排序的映射,但是没有提到java集。如果我在POJO中将项目存储在Jackson ObjectMapper:java.util.Set能否按升序顺序序列化为JSON数组?,java,json,serialization,jackson,set,Java,Json,Serialization,Jackson,Set,我有一个Java类型,我希望以升序排序的顺序将其序列化为JSON数组 有一个对象映射器特性可以序列化按映射键排序的映射,但是没有提到java集。如果我在POJO中将项目存储在java.util.Set中,JacksonObjectMapper会以任何顺序将它们序列化到JSON数组中吗 如果没有,我正在考虑为此目的为集合编写一个自定义序列化程序——有没有更好的方法可以推荐 最终,目标是将唯一整数数组反序列化到“请求”pojo中的某种容器中。然后处理请求并将该输入字段传递到“response”对象
java.util.Set
中,JacksonObjectMapper
会以任何顺序将它们序列化到JSON数组中吗
如果没有,我正在考虑为此目的为集合编写一个自定义序列化程序——有没有更好的方法可以推荐
最终,目标是将唯一整数数组反序列化到“请求”pojo中的某种容器中。然后处理请求并将该输入字段传递到“response”对象中相应的输出字段(未更改) 我想在POJO中将数据存储为
java.util.Set
,只是为了让所有用户满意(如果您尝试将其存储为Set
的子类型,那么POJO接口的消费者可能会感到不安,因为他们不能只获得Set
,而必须期望得到HashSet
或TreeSet
)
这样行吗
[5,4,3,2,1]
被反序列化为集合
,但我在setter方法上使用@jsondeseserialize(as=TreeSet.class)
。因此,对象的运行时类型现在是TreeSet
(即使它作为集存储在POJO中)
Set
通过服务器传递,并最终存储在响应POJO中(运行时类型仍然是TreeSet
,即使设置了POJO字段类型)ObjectMapper
将TreeSet
序列化为JSON数组[1,2,3,4,5]
(因为TreeSet
是自然排序的)ObjectMapper
会使用POJO字段的运行时类型还是声明的类型
如何确保我的
集合
按排序顺序转换为JSON数组?数组是有序集合,与Java数组完全相同:
数组是值的有序集合。数组以[
(左括号)开始,以]
(右括号)结束。值由,
(逗号)分隔
然而,有序并不意味着已排序。这只意味着它保留给定值的顺序:
- 如果对
进行了排序(例如集合
),则JSON数组将根据树集
的排序顺序进行排序: :根据使用的构造函数,使用元素的自然顺序或在设置的创建时间提供的顺序对元素进行排序集合
- 如果
是无序的(例如集合
),那么JSON数组是以哈希集合
返回的任意顺序 :它不保证集合的迭代顺序;特别是,它不能保证订单在一段时间内保持不变集合
{
(左大括号)开始,以}
(右大括号)结束。每个名称后面跟着:
(冒号),名称/值对之间用,
(逗号)分隔
可以创建一个Jackson来对集合
进行排序,将其转换为LinkedHashSet
,元素按所需的排序顺序排列
公共类OrderedSetConverter
扩展StdConverter>{
@凌驾
公共集合转换(集合值){
返回值==null?null:value.stream()
.sorted(Comparator.nullsLast(Comparator.naturalOrder()))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
}
公共类MyType{
@JsonSerialize(converter=OrderedSetConverter.class)
私有设置值;
}
当使用应用于属性时,生成的JSON数组将按顺序排序。此外,这可以应用于使用的属性,确保读取JSON产生的对象将具有排序迭代顺序的LinkedHashSet
我在项目中使用了这种方法,而不是使用
TreeSet
,原因如下。首先,我想接受集合中的null
值(主要是为了让我可以使用标准的空值处理,通过适当的API错误消息来处理它们,而不是在创建TreeSet
时发生NullPointerException
。其次,TreeSet
使用Compariable
更改标准集合契约中集合的语义对象的compareTo
方法来确定两个对象是否相等,而不是Objevt.equals()
。最后,我希望我的Java API客户端能够使用对其应用程序有意义的任何有效的Set
类型,而不是局限于TreeSet
这可能会对您有所帮助吗?谢谢@user-那篇文章是关于属性顺序序列化的。我的问题是关于Set-content-order序列化其他人建议同时使用树集。听起来像个计划!