首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解码可以是字符串或NSNumber的JSON值?

如何解码可以是字符串或NSNumber的JSON值?
EN

Stack Overflow用户
提问于 2015-10-19 19:41:29
回答 3查看 998关注 0票数 1

我正在消费的API有时会返回:

... total: "40" ...

有时:

... total: 40 ...

是否有一种清晰的方法可以编写一个无论已解析的json对象是NSString还是NSNumber都将提取int值的守护/let语句?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-19 19:56:04

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

代码语言:javascript
运行
复制
protocol HasNumber {
  var integerValue: Int { get }
}
extension NSString:HasNumber{}
extension NSNumber:HasNumber{}

然后:

代码语言:javascript
运行
复制
guard let total = (json["total"] as? HasNumber)?.integerValue else { }
票数 0
EN

Stack Overflow用户

发布于 2015-10-19 19:58:31

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-10-19 21:01:58

另一种方法

代码语言:javascript
运行
复制
let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ]
for (_, value) in jsonDict {
  print(Int("\(value)")!)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33222572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档