使用来自 json in Swift 的相同键解码字典

Decode dictionary with identical keys from json in Swift

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

struct Dog {
  var color: UIColor
}

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

"myDogs": {

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

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

}

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

令我惊讶的是它没有发生,相反它只是忽略了第一只狗之后的所有狗,即对于这个 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()

好的,所以你想知道是否有检测重复键错误的方法JSONDecoder

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

1。让我们解决您的 JSON 保持重复键不一致的问题

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

  1. A JSON 应与 {] 并以相同的符号结尾
  2. "#FFFFFF
  3. 结尾少了一个"
  4. 末尾少了一个,
  "veryGoodBoy": {
    "color": "#FFFFFF
  }

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

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

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

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

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

2。 Codable 结构

现在我们可以定义一个Codable类型(解码JSONs时我通常更喜欢结构)来匹配输入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)
}

这段代码运行良好,没有引发错误。 但是(当然)结果值缺少条目

Why did I say "of course"? Because Swift dictionaries cannot have duplicated keys.

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

4。注意事项

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