【问题标题】:What determines the order of returned JSON?什么决定了返回 JSON 的顺序?
【发布时间】:2021-07-19 03:17:18
【问题描述】:

如果这不是 Swift 问题,请原谅我,但目前我不知道。

我返回的 JSON 如下所示:

[
   {
      "name" : _,
      "age" : _,
      "jobs" : [],
      "gender" : _
   }
]

但我的 Codable Struct 看起来像

struct Person: Codable {
   let name: String
   let age: Int
   let gender: String
   let jobs: [Job]
}

是随机的还是我没有设置参数还是什么?

【问题讨论】:

  • JSON 字典本质上是无序的。如果您想了解为什么会这样,请检查您必须研究hash table 数据结构的工作原理。这就是 Swift 的 Dictionary 和 JSON 的对象背后的支持数据结构。
  • @SergioBost 答案是当你解码时,你会按名称而不是位置来匹配对象
  • 不,答案是字典没有任何顺序。对象可能每次都以相同的顺序到达,也可能不会。 JSON 和 Swift 都说字典是无序的
  • @SergioBost,JSON 中的“所有不是字典的东西”都是一个数组和一个值。数组是有序的,值是单数的
  • 视情况而定。一些框架允许您使用注释设置字段顺序。例如,在 Java Jackson 中,注释 @JsonPropertyOrder 可用于对 json 中的字段进行排序。但这只是提高人类可读性的装饰物(例如先拥有更重要的领域)。从程序化的角度来看,这没什么区别。

标签: swift vapor


【解决方案1】:

按照 JSON 规范的定义,JSON 的字典是无序的。即使您生成的 JSON 对象字段以特定方式排序,符合 JSON 规范的消费者也没有义务尊重您的排序。

Swift 的Dictioanry 同样是无序的,并且在每次应用启动时都会以不同的方式播种,以抵抗基于哈希冲突的 DOS 攻击。

话虽如此,有时尝试以对顺序敏感的方式操作 JSON 可能是有益的,即使规范没有要求。考虑一个用于操作在 git 中受版本控制的 JSON 文件的工具示例。

大多数工具的工作方式是读取文件的内容,将其解析为数据结构,操作数据结构,然后将其重新保存到文件中。这样的过程会导致小的更改(例如添加/删除单个键)导致条目的完全重新排列,对不相关的空白的更改等,所有这些都会破坏差异。

在这种情况下,使用顺序敏感的解析器和集合很有用,它们保留了有关原始文本的足够信息,以便您以最小的方式对其进行操作。

当然,使用这些文件的系统通常会忽略顺序。

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2023-03-13
    • 2011-03-16
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多