42

我有一个在我的 Java 程序中构建的 JSON 对象。

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

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

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

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

4

4 回答 4

67

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

没关系。_ 根据各种 JSON 规范,属性的顺序并不重要。例如:

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

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

不幸的是,有些傻子1忽略了规范的这一方面,并​​在属性的顺序上赋予了一些意义。(错误通常是在指定 API 的人和实现 API 的人之间存在脱节,而从事规范工作的人并不真正理解 JSON 时。)

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

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

艰难地,我害怕:

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

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

2 - RFC 7159 也说:“JSON 解析库在它们是否使对象成员的排序对调用软件可见方面存在差异。 其行为不依赖于成员排序的实现将在某种意义上是可互操作的他们不会受到这些差异的影响。 ”。根据我的阅读,这建议 JSON 库应该从应用程序代码中隐藏任何对的顺序。

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

于 2013-06-01T08:03:37.300 回答
10

恕我直言 不可能

JSON文档

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

所以方法是以所需的顺序获取值,而不是排序json

于 2013-06-01T07:52:10.203 回答
1

您可以使用 list 假设您的服务器可以接受它:

{"list": [ {"AAA":"aaa"},{"BBB":"bbb"},{"CCC":"ccc"}]}
于 2013-06-01T07:57:52.867 回答
-2

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

于 2018-01-29T20:18:23.077 回答