【问题标题】:Decode dictionary with identical keys from json in Swift在 Swift 中使用来自 json 的相同键解码字典
【发布时间】:2020-04-20 00:48:09
【问题描述】:

我有一个我在 JSON 文件中描述的结构,假设该结构名为 Dog

struct Dog {
  var color: UIColor
}

我在 JSON 文件的字典中跟踪我的狗,其中每只狗的名字都充当标识符。 所以我可以拥有下一个 JSON:

"myDogs": {

  "goodBoy": {
    "color": "#000000"
  },

  "veryGoodBoy": {
    "color": "#FFFFFF
  }

}

为了描述我的 2 条狗,它是一个字典,我(显然)希望避免重复键,所以我希望当我解码 myDogs 时,如果 JSON 中有 2 条狗具有相同的 [String: Dog] 类型key (name) 我会得到一些错误。

令我惊讶的是,它并没有发生,而是忽略了第一个之后的所有狗,即对于这个 JSON

"myDogs": {

  "goodBoy": {
    "color": "#000000"
  },

  "veryGoodBoy": {
    "color": "#FFFFFF
  }

  "goodBoy": {
    "color": "#FF0000"
  }

}

我会得到一本字典,里面有 2 条狗,一个叫“goodBoy”,黑色,另一个叫“veryGoodBoy”,白色。

有没有办法在解码阶段引发异常(或至少记录错误)?

提前致谢。

编辑

Does JSON syntax allow duplicate keys in an object? 有帮助,但它没有回答我的问题。 基本上我问的是 Swift 有没有办法在解码阶段引发异常而不重写 JSONDecoder()

【问题讨论】:

  • 您的回复中不应重复一个键
  • 三键 JSON 甚至无效。 JSONDecoder() 解码两个密钥并忽略重复项。但实际上避免字典中的重复键是服务器的业务。
  • @Gereon 谢谢,这有助于我理解 JSON 约定。但它没有回答我的问题,Swift 中有没有办法在解码阶段引发异常而不重写JSONDecoder()

标签: json swift dictionary codable


【解决方案1】:

好的,所以您想知道是否有办法使用JSONDecoder 检测重复键错误。

老实说,我不知道答案,所以我调查了一下。

1。让我们修复您的 JSON 保持重复键不一致

您的输入 JSON 除了重复键之外还有几个错误。

  1. JSON 应以 {] 结尾,并以相同的符号结尾
  2. “#FFFFFF”末尾缺少"
  3. 结尾处缺少,
  "veryGoodBoy": {
    "color": "#FFFFFF
  }

让我们应用这些修复,我们最终得到一个 JSON,其中唯一的错误是重复键

let data = """
{
    "myDogs": {

      "goodBoy": {
        "color": "#000000"
      },

      "veryGoodBoy": {
        "color": "#FFFFFF"
      },

      "goodBoy": {
        "color": "#FF0000"
      }
    }
}
""".data(using: .utf8)!

2。可编码结构

现在我们可以定义一个Codable 类型(我通常在解码 JSON 时更喜欢一个结构)来匹配输入 JSON

struct Response: Decodable {

    let myDogs: [String: Dog]

    struct Dog: Decodable {
        let color: String
    }
}

3。解码

最后让我们尝试解码 JSON

do {
    let dict = try JSONDecoder().decode(Response.self, from: data)
    print(dict)
} catch {
    print(error)
}

此代码运行良好,不会引发错误。 但是(当然)结果值缺少条目

为什么我说“当然”?因为 Swift 字典不能有重复的键。

Response(
    myDogs: [
        "goodBoy": Dog(color: "#000000"),
        "veryGoodBoy": Dog(color: "#FFFFFF")
    ]
)

4。注意事项

据我所知,您的问题的答案是:不,我们无法使用 JSONDecoder 检测到原始 JSON 中的重复键。

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多