值的序列是否在JSON对象中重要?

时间:2013-06-01 07:49:40

标签: java json

我有一个JSON对象,我在Java程序中构建了它。

JSONObject jObj = {"AAA:aaa","BBB:bbb","CCC:ccc"}

我将此对象发送到服务器,在该服务器中,它需要以下类型的JSON对象。

{"BBB:bbb", "AAA:aaa", "CCC:ccc"}

我的问题是JSON对象的顺序在服务器端真的很重要吗?如果是,我该如何更改订单?

4 个答案:

答案 0 :(得分:37)

  

我的问题是JSON对象的顺序在服务器端真的很重要吗?

不应该重要。根据各种JSON规范,属性的顺序并不重要。例如:

  

“对象是一组无序的名称/值对。” (来源json.org

     

“对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组。” (来源RFC 7159

不幸的是,那里有一些人, 1 忽略了规范的这一方面,并​​对属性的顺序赋予了一些重要性。 (通常在指定API的人与实现API的人之间断开连接时会出现错误,而执行规范工作的人员并不真正了解JSON。)

幸运的是,设计/实施服务器的人很可能没有犯这个错误。我遇到的大多数Java JSON解析器在解析时都不保留属性顺序...默认情况下 2 。很难意外地实现一个服务器,其中被解析的JSON属性的顺序很重要。

  

如果是,我该如何更改订单?

我很担心:

  • 您可以手动生成JSON。
  • 至少有一个JSON for java implementation 3 ,它允许您提供包含JSON对象属性的Map对象。如果您使用LinkedHashMapTreeMap,则应保留插入顺序或属性键的词法顺序。

1 - 例如,这个可怜的开发人员正在为之工作的傻瓜...... https://stackoverflow.com/a/4515863/139985

2 - RFC 7159也说:“观察到JSON解析库是否会使对象成员的排序对调用软件可见。其行为不依赖于的实现成员排序将是可互操作的,因为它们不会受到这些差异的影响。“。通过我的阅读,这建议JSON库应该隐藏应用程序代码中任何对的顺序。

3 - JSON-simple:https://code.google.com/p/json-simple/。也可能有其他人。

答案 1 :(得分:11)

恕我直言 不可能

JSON docs

  

对象是一组无序的名称/值对

因此,方法是按所需顺序获取值,而不是排序json

答案 2 :(得分:1)

您可以使用列表,假设您的服务器可以接受它:

{"list": [ {"AAA":"aaa"},{"BBB":"bbb"},{"CCC":"ccc"}]}

答案 3 :(得分:-3)

JSON对象中的字段顺序实际上很重要。这取决于您使用的序列化程序。例如,当序列化继承的对象时,您将获得一个名为type =''的额外JSON字段。反序列化时,类型字段必须位于任何其他JSON字段之前,否则它将采用父类型。