JSON调用返回字典,如下所示。可能缺少这两个值中的任何一个,或者“secondLevel”字典本身。
{
"theMain" : {
"secondLevel" : {
"value1" : "5.3",
"value2" : "bbb"
}
}
}
我正在使用保护声明解析:
guard let main = theJson["theMain"] as? [String : Any] else {
return
}
guard let second = main["secondLevel"] as? [String : Any] else {
let second = [String : Any]()
}
guard second.count > 0,
let firstValue = second["value1"] as? String else {
let firstValue = "n/a"
}
guard second.count > 0,
let secondValue = second["value2"] as? String else {
let secondValue = "n/a"
}
有更好的方法吗?
答案 0 :(得分:3)
更好的方法是使用一个保护语句检查密钥theMain
,secondLevel
以及secondLevel
字典中的项目数是否为> 0
由于secondLevel
字典仅包含字符串值,因此将其强制转换为[String : String]
,以避免进一步向下转换。
如果密钥丢失,最后使用nil-coalescing运算符指定n / a。
guard let main = theJson["theMain"] as? [String : Any],
let second = main["secondLevel"] as? [String : String], !second.isEmpty {
return
}
let firstValue = second["value1"] ?? "n/a"
let secondValue = second["value2"] ?? "n/a"
答案 1 :(得分:0)
借用@ vadian answer的优秀创意,特别是nil coalescing operator以及更好的演员,这对我有用:
guard let main = incoming["theMain"] as? [String : Any] else {
return
}
let second = main["secondLevel"] as? [String : String] ?? [String : String]()
let firstValue = second["value1"] ?? "n/a"
let secondValue = second["value2"] ?? "n/a"