带保护语句的Swift解析字典

时间:2016-10-25 04:32:58

标签: json swift dictionary

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"
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

更好的方法是使用一个保护语句检查密钥theMainsecondLevel以及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"