转载于: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。直到对其调用stringnumberbool之类来获取Swift中的数据类型值时,才会返回nil

这套机制是类似于Optional<T>可选类型的,但是不同的是,Optional中对nil调用方法会crash,但JSONValue中对JInvalid调用方法不会crash,而是继续返回JInvalid。这样使用时就不用写一堆?号啦,反正不会出错滴。

同时,它给JSONValue枚举还创建了其它json中使用到的各种类型JNumberJStringJBool,它们能通过构造器将原始值包装起来,然后最后通过对应的numberstringbool等属性方法来拆包,得到原始值。

推荐大家也读读这个库的源代码,其对enum的使用灰常巧妙!

SwiftyJSON库的使用和思考相关推荐

  1. 关于C++中Eigen库效率提升的思考

    目录 引言 一.什么是Eigen? 二.使用步骤 1.引入库 2.建立矩阵 3.基本操作 三.具体的例子--矩阵乘法 1.Eigen库 2.GPU并行计算 总结 可能的方案 引言 在处理矩阵运算上,各 ...

  2. python 内置标准库socketserver模块的思考

    socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...

  3. 第一章导言的笔记与思考

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket ~:较重要 ~~:重要 1.1 hello,world ~初学人来说还是一大障碍,手写编写程序文本,然 ...

  4. 表现层框架Struts/Tapestry/JSF架构比较 [转]

    http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术.从诞生时间上看,Struts应该比较早,使用得 ...

  5. Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire

    升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swif ...

  6. 什么是python-三分钟了解什么是Python?python环境搭建

    原标题:三分钟了解什么是Python?python环境搭建 Python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C++之后的的第三大语言. ...

  7. python中是干嘛的-python是做什么的,新手必看哦!

    原标题:python是做什么的,新手必看哦! ​python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C 之后的的第三大语言.特点:简单易学 ...

  8. 学会python爬虫怎么赚钱-转行学Python有前途吗?Python爬虫怎么赚钱?

    Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C++之后的第三大语言.下面就跟着千锋一起来看看吧! Python的特点:简单易学.免费开源 ...

  9. java 高飞_高飞(土木与水利工程学院)老师 - 合肥工业大学

    高飞 高飞老师的简历 姓名:高飞 性别:男 出生年月:1962.11 最终学位:硕士 毕业院校:合肥工业大学 职称:教授 职务:副院长 电话:0551-2901441,13705510744 E-ma ...

最新文章

  1. 对比java_java集合对比
  2. 生产中NFS案例记录---写入权限解决过程
  3. JS笔记(一):声明提升
  4. 硬核!Python 四种变量的代码对象和反汇编分析
  5. AMD猛攻数据中心市场,拿下15年来最高份额,英特尔DCG收入下滑20%
  6. 如何在android studio中设置sdk path?
  7. python-list列表排序问题 sort 与 sorted
  8. 线性拟合——从最大似然估计到平方误差到huber loss
  9. 58欧氏空间05——对称变换和对称矩阵、实对称矩阵的标准形、正交相似、实对称矩阵的正交相似对角化
  10. Cisdem PDFMaster for Mac(PDF批量转换工具)
  11. 畅管进销存管理系统 v6.0
  12. 【算法】06 GLUE算法C++实现
  13. c语言间接级别不同_间接寻址不同问题?求解决!
  14. 美国计算机专业大学排名前30,美国计算机专业研究生大学排名TOP30
  15. 集合添加元素python_集 - 百度文库
  16. MOOC北京理工《C语言程序设计(上)》第5周第3题:求最小m值
  17. Redis_Study
  18. Java回炉之多线程(一)
  19. ZBrush坐标轴控制
  20. 【无人机】基于混合粒子群算法求解无人机航迹规划问题附Matlab代码

热门文章

  1. java中如何创建字符串数组
  2. Casinos and travel[智力和快速幂]
  3. 最常用计算机机箱,好看又实用 给你的电脑选一个好机箱
  4. 每周翻译一篇前端技术英文官网(二)
  5. SOP8 SSOP8区别
  6. 画表格自动生成html语言,HTML——绘制表格-Go语言中文社区
  7. destoon首页底部加产品分类拼音索引
  8. hdu1426一道很有意思的题目:数独
  9. RedisUtil,Redis工具类
  10. 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度