SwiftyJSON库的使用和思考
转载于:http://swiftist.org/topics/124#2
最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?
)和可选(Optional
),看?
号都看花了。随后发现了这个库SwiftyJSON,问题迎刃而解,灰常优雅和Swifty!
简单介绍下这个库(内容译自SwiftyJSON的README
):
为什么典型的在Swift中处理JSON的方法不好?
Swift语言是一种严格的类型安全语言,它要求我们显示的设置类型,并帮助我们写出更少bug的代码。但是当处理JSON这种天生就是隐式类型的数据结构,就非常麻烦了。
拿Twitter中timeline API返回的数据为例:
[{......"text": "just another test",......"user": {"name": "OAuth Dancer","favourites_count": 7,"entities": {"url": {"urls": [{"expanded_url": null,"url": "http://bit.ly/oauth-dancer","indices": [0,26],"display_url": null}]}......},"in_reply_to_screen_name": null,},......]
Swift中的解析代码会是这样:
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let statusesArray = jsonObject as? NSArray{if let aStatus = statusesArray[0] as? NSDictionary{if let user = aStatus["user"] as? NSDictionary{if let userName = user["name"] as? NSDictionary{//终于我们得到了`name`
}}}
}
不好吧。就算是换成可选链式调用,也还是一团糟:
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let userName = (((jsonObject as? NSArray)?[0] as? NSDictionary)?["user"] as? NSDictionary)?["name"]{//上面这一堆是个啥??
}
使用SwiftyJSON
你只要这样做就行了:
let json = JSONValue(dataFromNetworking)
if let userName = json[0]["user"]["name"].string{//恩~ `name`到手,就这么简单
}
你不需要考虑可选类型的拆包和是否能拆包的判断,这些都自动完成了:
let json = JSONValue(dataFromNetworking)
if let userName = json[999999]["wrong_key"]["wrong_name"].string{//冷静,嘿嘿~ 调用不存在的["wrong_key]也不会crash滴, .string最终能安全的返回一个字符串或`nil`
}
let json = JSONValue(jsonObject)
switch json["user_id"]{case .JString(let stringValue):let id = stringValue.toInt()
case .JNumber(let doubleValue):let id = Int(doubleValue)
default:println("ooops!!! JSON Data is Unexpected or Broken")
后记:SwiftyJSON是怎么做到的?
看到这个库之后,一方面很爽终于有合适的处理JSON的方法了;另一方面心里其实很好奇它是怎么做到的?
通过看源代码,才了解到它是创建了一个JSONValue
枚举,这个枚举中有一个JInvalid
类型。当使用json字符串来构造JSONValue
对象时,如果无法构建成功,就会返回这个JInvalid
枚举对象,然后对这个JInvalid
枚举对象继续处理,会继续返回JInvalid
。直到对其调用string
, number
, bool
之类来获取Swift中的数据类型值时,才会返回nil
。
这套机制是类似于Optional<T>
可选类型的,但是不同的是,Optional中对nil
调用方法会crash,但JSONValue
中对JInvalid
调用方法不会crash,而是继续返回JInvalid
。这样使用时就不用写一堆?
号啦,反正不会出错滴。
同时,它给JSONValue
枚举还创建了其它json中使用到的各种类型JNumber
, JString
, JBool
,它们能通过构造器将原始值包装起来,然后最后通过对应的number
,string
,bool
等属性方法来拆包,得到原始值。
推荐大家也读读这个库的源代码,其对enum
的使用灰常巧妙!
SwiftyJSON库的使用和思考相关推荐
- 关于C++中Eigen库效率提升的思考
目录 引言 一.什么是Eigen? 二.使用步骤 1.引入库 2.建立矩阵 3.基本操作 三.具体的例子--矩阵乘法 1.Eigen库 2.GPU并行计算 总结 可能的方案 引言 在处理矩阵运算上,各 ...
- python 内置标准库socketserver模块的思考
socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...
- 第一章导言的笔记与思考
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket ~:较重要 ~~:重要 1.1 hello,world ~初学人来说还是一大障碍,手写编写程序文本,然 ...
- 表现层框架Struts/Tapestry/JSF架构比较 [转]
http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术.从诞生时间上看,Struts应该比较早,使用得 ...
- Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swif ...
- 什么是python-三分钟了解什么是Python?python环境搭建
原标题:三分钟了解什么是Python?python环境搭建 Python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C++之后的的第三大语言. ...
- python中是干嘛的-python是做什么的,新手必看哦!
原标题:python是做什么的,新手必看哦! python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C 之后的的第三大语言.特点:简单易学 ...
- 学会python爬虫怎么赚钱-转行学Python有前途吗?Python爬虫怎么赚钱?
Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C++之后的第三大语言.下面就跟着千锋一起来看看吧! Python的特点:简单易学.免费开源 ...
- java 高飞_高飞(土木与水利工程学院)老师 - 合肥工业大学
高飞 高飞老师的简历 姓名:高飞 性别:男 出生年月:1962.11 最终学位:硕士 毕业院校:合肥工业大学 职称:教授 职务:副院长 电话:0551-2901441,13705510744 E-ma ...
最新文章
- 对比java_java集合对比
- 生产中NFS案例记录---写入权限解决过程
- JS笔记(一):声明提升
- 硬核!Python 四种变量的代码对象和反汇编分析
- AMD猛攻数据中心市场,拿下15年来最高份额,英特尔DCG收入下滑20%
- 如何在android studio中设置sdk path?
- python-list列表排序问题 sort 与 sorted
- 线性拟合——从最大似然估计到平方误差到huber loss
- 58欧氏空间05——对称变换和对称矩阵、实对称矩阵的标准形、正交相似、实对称矩阵的正交相似对角化
- Cisdem PDFMaster for Mac(PDF批量转换工具)
- 畅管进销存管理系统 v6.0
- 【算法】06 GLUE算法C++实现
- c语言间接级别不同_间接寻址不同问题?求解决!
- 美国计算机专业大学排名前30,美国计算机专业研究生大学排名TOP30
- 集合添加元素python_集 - 百度文库
- MOOC北京理工《C语言程序设计(上)》第5周第3题:求最小m值
- Redis_Study
- Java回炉之多线程(一)
- ZBrush坐标轴控制
- 【无人机】基于混合粒子群算法求解无人机航迹规划问题附Matlab代码