【问题标题】:Does the sequence of the values matter in a JSON object?JSON 对象中值的顺序是否重要?
【发布时间】:2013-05-28 01:12:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您面临的问题是什么?有什么错误或异常吗?
  • JSON RFC (RFC 4627) 说对象成员的顺序无关紧要。
  • Google 将我带回这里时请注意:MongoDB 在检查对象相等性时对键的顺序很敏感。如果您有一个带有 _id:{key1:"foo", key2:"bar"} 的文档,您将无法使用 find({_id:{key2:"bar", key1:"foo"}}) 找到它。
  • @ahains - 请注意 :-) MongoDB 语法不是 JSON ...严格来说。

标签: java json


【解决方案1】:

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

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

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

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

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

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

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

我担心会遇到困难:

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

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

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

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

【讨论】:

  • “确实有傻瓜”。我在这里查看使用 .split(",") 和 substring() 解析 JSON 的代码。
  • 您可以添加一个 JSON 属性,列出 JSON 数据反序列化到的顺序管理数据结构中 JSON 属性的顺序。很多编码乐趣和添加单元测试。
  • 是的,你可以。但更直接的表示方式是对象(或数组)的 JSON 数组,其中每个对象(或数组)代表一个名称/值对。
【解决方案2】:

恕我直言 不可能

JSON docs

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你在描述一个错误
      • 我认为如果他提到发生这种情况的位置(哪个序列化程序?),那将是一个有效的答案。不管有没有错误,当一个人试图创建一个现实生活中的应用程序时,实践中的真相比纸上的主张更重要。
      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多