如何解码可以是String或NSNumber的JSON值?

时间:2015-10-19 19:41:29

标签: swift

我消耗的API有时会返回:

... total: "40" ...

有时候:

... total: 40 ...

是否有一种干净的方法来编写一个guard / let语句,它将提取一个int值,无论解析的json对象是NSString还是NSNumber?

注意:我正在寻找如何解码值的答案,而不是对允许我解决问题的库的引用。我已经了解SwiftyJSON等。

3 个答案:

答案 0 :(得分:1)

您可以使用AnyObject上可以调用任何方法的事实 通过可选链接。例如:

let jsonDict : [String : AnyObject] = ["foo" : 40, "bar" : "50" ]

if let val = jsonDict["foo"]?.integerValue 
{
    print(val) // 40
}

if let val = jsonDict["bar"]?.integerValue 
{
    print(val) // 50
}

如果密钥的值不存在,或者没有响应 到integerValue,结果是nil和可选的绑定 失败。否则,整数值将分配给val

答案 1 :(得分:0)

我意识到我可以定义一个协议,为integerValueNSString指定NSNumber getter和空协议扩展,然后将值转换为该协议:

protocol HasNumber {
  var integerValue: Int { get }
}
extension NSString:HasNumber{}
extension NSNumber:HasNumber{}

然后:

guard let total = (json["total"] as? HasNumber)?.integerValue else { }

答案 2 :(得分:0)

一种不同的方法

let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ]
for (_, value) in jsonDict {
  print(Int("\(value)")!)
}