1,SwiftyJSON介绍与配置

SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。

GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON

2,SwiftyJSON的优点
同  JSONSerializationSwiftyJSON 相比,在获取多层次结构的JSON数据时。 SwiftyJSON不需要一直判断这个节点是否存在,是不是我们想要的class,下一个节点是否存在,是不是我们想要的class…。同时,SwiftyJSON内部会自动对 optional(可选类型)进行拆包(Wrapping ),大大简化了代码。

下面通过几个样例作为演示。(本文代码均已升级至  Swift3

(1)比如我们有一个如下的JSON数据,表示联系人集合:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[
     {
         "name" "hangge"
         "age" : 100, 
         "phones" : [
             {
                 "name" "公司"
                 "number" "123456"
             }, 
             {
                 "name" "家庭"
                 "number" "001"
             }
         ]
     },
     {
         "name" "big boss"
         "age" : 1, 
         "phones" : [
             {
                 "name" "公司"
                 "number" "111111"
             }
         ]
     }
]

为便于测试比较,我们先将JSON格式的字符串转为Data:

1
2
3
4
5
let  jsonStr =  "[{\"name\": \"hangge\", \"age\": 100, \"phones\": [{\"name\": \"公司\",\"number\": \"123456\"}, {\"name\": \"家庭\",\"number\": \"001\"}]}, {\"name\": \"big boss\",\"age\": 1,\"phones\": [{ \"name\": \"公司\",\"number\": \"111111\"}]}]"
if  let  jsonData = jsonStr.data(using:  String . Encoding .utf8, allowLossyConversion:  false ) {
     //.........
}

(2)使用JSONSerializationSwiftyJSON解析
比如我们要取第一条联系人的第一个电话号码,每个级别都判断就很麻烦,代码如下:

1
2
3
4
5
6
7
if  let  userArray = try?  JSONSerialization .jsonObject(with: jsonData,
                                         options: .allowFragments)  as ? [[ String AnyObject ]],
     let  phones = userArray?[0][ "phones" as ? [[ String AnyObject ]],
     let  number = phones[0][ "number" as String  {
     // 找到电话号码
     print ( "第一个联系人的第一个电话号码:" ,number)
}

即使使用optional来简化一下,代码也不少:

1
2
3
4
5
6
if  let  userArray = try?  JSONSerialization .jsonObject(with: jsonData,
                                         options: .allowFragments)  as ? [[ String AnyObject ]],
     let  number = (userArray?[0][ "phones" as ? [[ String AnyObject ]])?[0][ "number" as String  {
     // 找到电话号码
     print ( "第一个联系人的第一个电话号码:" ,number)
}

(3)使用SwiftyJSON解析:
不用担心数组越界,不用判断节点,拆包什么的,代码如下:

1
2
3
4
5
let  json =  JSON (data: jsonData)
if  let  number = json[0][ "phones" ][0][ "number" ].string {
     // 找到电话号码
     print ( "第一个联系人的第一个电话号码:" ,number)
}

如果没取到值,还可以走到错误处理来了,打印一下看看错在哪:

1
2
3
4
5
6
7
8
let  json =  JSON (data: jsonData)
if  let  number = json[0][ "phones" ][0][ "number" ].string {
     // 找到电话号码
     print ( "第一个联系人的第一个电话号码:" ,number)
} else  {
     // 打印错误信息
     print (json[0][ "phones" ][0][ "number" ])
}

3,获取网络数据,并使用SwiftyJSON解析
除了解析本地的JSON数据,我们其实更常通过url地址获取远程数据并解析。
(1)与URLSession结合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//创建URL对象
let  url =  URL (string: "http://www.hangge.com/getJsonData.php" )
//创建请求对象
let  request =  URLRequest (url: url!)
let  dataTask =  URLSession .shared.dataTask(with: request,
                        completionHandler: {(data, response, error) ->  Void  in
                         if  error !=  nil {
                             print (error)
                         } else {
                             let  json =  JSON (data: data!)
                             if  let  number = json[0][ "phones" ][0][ "number" ].string {
                                 // 找到电话号码
                                 print ( "第一个联系人的第一个电话号码:" ,number)
                             }
                         }
})  as  URLSessionTask
//使用resume方法启动任务
dataTask.resume()

(2)与Alamofire结合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//创建URL对象
let  url =  URL (string: "http://www.hangge.com/getJsonData.php" )!
Alamofire .request(url).validate().responseJSON { response  in
     switch  response.result.isSuccess {
     case  true :
         if  let  value = response.result.value {
             let  json =  JSON (value)
             if  let  number = json[0][ "phones" ][0][ "number" ].string {
                 // 找到电话号码
                 print ( "第一个联系人的第一个电话号码:" ,number)
             }
         }
     case  false :
         print (response.result.error)
     }
}

4,获取值

(1)可选值获取(Optional getter)
通过.number、.string、.bool、.int、.uInt、.float、.double、.array、.dictionary、int8、Uint8、int16、Uint16、int32、Uint32、int64、Uint64等方法获取到的是可选择值,我们需要自行判断是否存在,同时不存在的话可以获取具体的错误信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//int
if  let  age = json[0][ "age" ].int {
     print (age)
else  {
     //打印错误信息
     print (json[0][ "age" ])
}
     
//String
if  let  name = json[0][ "name" ].string {
     print (name)
else  {
     //打印错误信息
     print (json[0][ "name" ])
}

(2)不可选值获取(Non-optional getter)
使用  xxxValue 这样的属性获取值,如果没获取到的话会返回一个默认值。省得我们再判断拆包了。

1
2
3
4
5
6
7
8
9
10
11
//If not a Number or nil, return 0
let  age:  Int  = json[0][ "age" ].intValue
//If not a String or nil, return ""
let  name:  String  = json[0][ "name" ].stringValue
//If not a Array or nil, return []
let  list:  Array < JSON > = json[0][ "phones" ].arrayValue
//If not a Dictionary or nil, return [:]
let  phone:  Dictionary < String JSON > = json[0][ "phones" ][0].dictionaryValue

(3)获取原始数据(Raw object)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let  jsonObject = json.object  as  AnyObject
let  jsonObject = json.rawValue   as  AnyObject
//JSON转化为Data
let  data = json.rawData()
//JSON转化为String字符串
if  let  string = json.rawString() {
     //Do something you want
}
//JSON转化为Dictionary字典([String: AnyObject]?)
if  let  dic = json.dictionaryObject {
     //Do something you want
}
//JSON转化为Array数组([AnyObject]?)
if  let  arr = json.arrayObject {
     //Do something you want
}

5,设置值

1
2
3
4
json[0][ "age" ].int =  101
json[0][ "name" ].string =   "hangge.com"
json[0][ "phones" ].arrayObject = [[ "name" : "固话" "number" :110],[ "name" : "手机" "number" :120]]
json[0][ "phones" ][0].dictionaryObject = [ "name" : "固话" "number" :100]

6,下标访问(Subscript)
可以通过数字、字符串、数组类型的下标访问JSON数据的层级与属性。比如下面三种方式的结果都是一样的:

1
2
3
4
5
6
7
8
9
//方式1
let  number = json[0][ "phones" ][0][ "number" ].stringValue
     
//方式2
let  number = json[0, "phones" ,0, "number" ].stringValue
     
//方式3
let  keys:[ JSONSubscriptType ] = [0, "phones" ,0, "number" ]
let  number = json[keys].stringValue

7,循环遍历JSON对象中的所有数据
(1)如果JSON数据是数组类型(Array)

1
2
3
for  (index,subJson):( String JSON in  json {
     print ( "\(index):\(subJson)" )
}

(2)如果JSON数据是字典类型(Dictionary)

1
2
3
for  (key,subJson):( String JSON in  json[0] {
     print ( "\(key):\(subJson)" )
}

8,构造创建JSON对象数据
(1)空的JSON对象

1
let  json:  JSON  =   nil

(2)使用简单的数据类型创建JSON对象

1
2
3
4
5
6
7
8
9
10
11
//StringLiteralConvertible
let  json:  JSON  "I'm a son"
//IntegerLiteralConvertible
let  json:  JSON  =  12345
//BooleanLiteralConvertible
let  json:  JSON  =   true
//FloatLiteralConvertible
let  json:  JSON  =  2.8765

(3)使用数组或字典数据创建JSON对象

1
2
3
4
5
6
7
8
9
10
11
12
//DictionaryLiteralConvertible
let  json:  JSON  =  [ "I" : "am" "a" : "son" ]
//ArrayLiteralConvertible
let  json:  JSON  =  [ "I" "am" "a" "son" ]
//Array & Dictionary
var  json:  JSON  =  [ "name" "Jack" "age" : 25,  "list" : [ "a" "b" "c" , [ "what" "this" ]]]
json[ "list" ][3][ "what" ] =  "that"
json[ "list" ,3, "what" ] =  "that"
let  path:[ JSONSubscriptType ] = [ "list" ,3, "what" ]
json[path] =  "that"

[绍棠_Swift] SwiftyJSON的使用详解(附样例,用于JSON数据处理)相关推荐

  1. [绍棠] 应用内支付(IAP)详解

    1.IAP流程 IAP流程分为两种,一种是直接使用Apple的服务器进行购买和验证,另一种就是自己假设服务器进行验证.由于国内网络连接Apple服务器验证非常慢,而且也为了防止黑客伪造购买凭证,通用做 ...

  2. HashMap类Compute方法详解及样例

    hashMap简介 hashMap是基于Map的实现,并且允许null value和null key,它不保证存储的数据的顺序.特别要注意的是hashMap不是同步的,要实现同步除了在外部实现同步外, ...

  3. Python os.path() 模块 详解 附算例

    Python os.path() 模块 函数 说明 os.path.abspath(path) 返回绝对路径 os.path.basename(path) 返回文件名 os.path.commonpr ...

  4. java可变参数(详解+代码样例)

    可变参数 基本概念:java允许将同一个类中多个同名,同功能但参数个数不同的方法封装成一个方法.就可以通过可变参数实现. 基本语法:访问修饰符\color{#FF0000}{访问修饰符}访问修饰符 返 ...

  5. Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理)

    转自:http://www.hangge.com/blog/cache/detail_968.html Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理) 2016-01- ...

  6. java编程50实例_java编程实例大全及详解谜底(50例).doc

    java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...

  7. python3 json模块_详解python 3.6 安装json 模块(simplejson)

    JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反 ...

  8. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  9. 高帧率扑克牌识别技术详解一(可用于车牌识别,字符识别,人脸检测,验证码识别等等成熟领域)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 高帧率扑 ...

最新文章

  1. bug诞生记——不定长参数隐藏的类型问题
  2. IBM AIX JFS 数据恢复记录(暂)
  3. Tomcat 服务器server.xml,web.xml的关键参数配置
  4. 好用的工具---screen命令
  5. 不会演讲的你,一开口就输了
  6. (pytorch-深度学习系列)CNN中的池化层-学习笔记
  7. linux下配置环境变量方式
  8. 图论(一)—— 基本概念
  9. Libevent源码分析-----日志和错误处理
  10. link.exe 的参数
  11. 剧透和评析之車輪の国、向日葵の少女
  12. 教你如何零基础备考公务员
  13. 北斗导航 | 两个地面站之间的多跳卫星通信链路(附matlab代码)
  14. POI合并单元格,赋值
  15. java实现图片查看器
  16. iOS Presenting view controllers on detached view controllers is discouraged
  17. 判断输入的手机号码格式是否正确(用Java实现)
  18. 红米note8Pro6400万像素爆发,但不会这些拍照技巧,四摄等于摆设
  19. 2.12父子进程通过匿名管道通信
  20. 创建一个有向图,并输出各个节点的出度和入度(邻接矩阵存储)

热门文章

  1. 用signalr实现简单的网页实时聊天
  2. 兰州计算机非全日制硕士有哪些学校,兰州大学2018年非全日制热门学科专业有哪些...
  3. 如何看待测试过程中的漏测发生
  4. 【电力电子】【2011.08】通过谐波电流注入改善三相整流器输入功率因数
  5. SQL server 清空数据库所有表
  6. POI-HSSFWorkbook合并单元格
  7. golang报错: WaitGroup is reused before previous Wait has returned
  8. mysql between and 日期
  9. 常见webshell工具
  10. 最新H5游戏小游戏集成系统400多款趣味游戏