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

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

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

我将此对象发送到服务器,在该服务器中,它期望JSON对象具有以下类型。

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

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

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

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

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

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

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

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

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

我很担心:

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

1 – 例如,这个可怜的开发人员正在努力的傻瓜…… https://stackoverflow.com/a/4515863/139985

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

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

恕我直言 不可能

JSON文档说

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

所以方法是按所需顺序获取值,而不是订购json

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

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

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

 public static void jsonpdf() { LinkedHashMap lm = new LinkedHashMap<>(); lm.put("BBB","bbb"); lm.put("AAA","aaa"); lm.put("CCC","ccc"); Gson gson = new Gson(); String json = gson.toJson(lm); System.out.println(json); }