Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jackson ObjectMapper:java.util.Set能否按升序顺序序列化为JSON数组?_Java_Json_Serialization_Jackson_Set - Fatal编程技术网

Jackson ObjectMapper:java.util.Set能否按升序顺序序列化为JSON数组?

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类型,我希望以升序排序的顺序将其序列化为JSON数组

有一个对象映射器特性可以序列化按映射键排序的映射,但是没有提到java集。如果我在POJO中将项目存储在
java.util.Set
中,Jackson
ObjectMapper
会以任何顺序将它们序列化到JSON数组中吗

如果没有,我正在考虑为此目的为集合编写一个自定义序列化程序——有没有更好的方法可以推荐


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

我想在POJO中将数据存储为
java.util.Set
,只是为了让所有用户满意(如果您尝试将其存储为
Set
的子类型,那么POJO接口的消费者可能会感到不安,因为他们不能只获得
Set
,而必须期望得到
HashSet
TreeSet

这样行吗

  • JSON数组
    [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
    是自然排序的)
  • 上面的第3项是我想知道的一项-
    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序列化其他人建议同时使用树集。听起来像个计划!