使用来自 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 除了重复键外还有几个错误。
- A JSON 应与
{
或 ]
并以相同的符号结尾
- "#FFFFFF
结尾少了一个"
末尾少了一个,
"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 中的重复密钥。
我在 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 除了重复键外还有几个错误。
- A JSON 应与
{
或]
并以相同的符号结尾 - "#FFFFFF 结尾少了一个
"
末尾少了一个,
"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 中的重复密钥。