当前位置: 首页 > 知识库问答 >
问题:

Jackson ObjectMapper:java.util.set可以按升序序列化为JSON数组吗?

吴修洁
2023-03-14

我有一个comparable类型的JavaJava.util.set,我希望将其序列化为升序排序的JSON数组。

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

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

我希望将数据以java.util.set 的形式存储在POJO中,以使所有用户满意(如果您试图将其存储为set的子类型,那么POJO接口的使用者可能会感到不安,因为他们不能只得到set而是必须得到hashsettreeset)。

这样行吗?

  1. JSON数组[5,4,3,2,1]反序列化为set ,但是,我在setter方法上使用了@jsonDeserialize(as=treeSet.class)。因此,对象的运行时类型现在是treeset(即使它作为set存储在POJO中)。
  2. Set通过服务器传递,并最终存储在响应POJO中(运行时类型仍然是treeSet,即使POJO字段类型已设置)。
  3. objectmapper树集序列化为JSON数组[1,2,3,4,5](因为树集是自然排序的)。

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

如何确保set按排序顺序转换为JSON数组?

共有1个答案

于嘉誉
2023-03-14

JSON数组是一个有序集合,与Java数组完全相同:

数组是值的有序集合。数组以[(左方括号)开始,以](右方括号)结束。值之间用,(逗号)分隔。

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

这与JSON对象的字段不同:

对象是一组无序的名称/值对。对象以{(左括号)开头,以}(右括号)结尾。每个名称后跟:(冒号),名称/值对之间用,(逗号)分隔。

 类似资料:
  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 问题内容: 创建NumPy数组并将其另存为Django上下文变量后,加载网页时出现以下错误: 这是什么意思? 问题答案: 我定期“ jsonify” np.arrays。尝试首先在数组上使用“ .tolist()”方法,如下所示: 为了“ unjsonify”数组使用:

  • 问题内容: 我有以下用于序列化查询集的代码; 以下是我的 我需要序列化。但是它说无法序列化。因为列表由Django对象和字典组成。有任何想法吗 ? 问题答案: 并且不能很好地与Django对象配合使用。 Django的内置序列化器只能序列化由django对象填充的查询集: 在您的情况下,其中包含django对象和dict的混合。 一种选择是摆脱中的模型实例,并使用dict将其替换为: 希望有帮助。

  • 问题内容: Python中是否有一种方法可以序列化使用元组作为键的字典: 只需使用json.dumps(a),就会产生: 问题答案: 您不能将其序列化为json,json对于什么算作dict键要比python灵活得多。 您可以将映射转换为键,值对的序列,如下所示:

  • 假设我有一个这样的POJO: 我希望创建一个自定义序列化程序来输出以下内容: 但这里有一个问题,它不是特定于POJO1的。这意味着对另一个POJO进行相同的序列化: 或者任何具有 TypeA 或 TypeB 属性的类,这意味着这些方法可以更改。我不喜欢以基类或接口为目标,因为我的序列化程序将被开发我从未想象过的其他类的人使用。我一直在考虑注册TypeA和TypeB序列化程序,但它们似乎不允许我更改

  • 问题内容: 我在反序列化一些json数据,获取InvalidCastExceptions之类的问题。 谁能指出我正确的方向? 这是我要反序列化的json; [{“ OrderId”:0,“名称”:“摘要”,“ MaxLen”:“ 200”},{“ OrderId”:1,“名称”:“详细信息”,“ MaxLen”:“ 0”}] 这是我的代码; 问题答案: OrderId是json中的一个Int(请注