當(dāng)前位置:
                    首頁 >
                            前端技术
>                            javascript
>内容正文                
                        
                    javascript
SwiftyJSON的使用详解
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                SwiftyJSON的使用详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                轉(zhuǎn)載?點擊打開鏈接
1,SwiftyJSON介紹與配置SwiftyJSON是個使用Swift語言編寫的開源庫,可以讓我們很方便地處理JSON數(shù)據(jù)(解析數(shù)據(jù)、生成數(shù)據(jù))。GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON使用配置:直接將?SwiftyJSON.swift?添加到項目中即可。
2,SwiftyJSON的優(yōu)點
同?JSONSerializationSwiftyJSON?相比,在獲取多層次結(jié)構(gòu)的JSON數(shù)據(jù)時。SwiftyJSON不需要一直判斷這個節(jié)點是否存在,是不是我們想要的class,下一個節(jié)點是否存在,是不是我們想要的class…。同時,SwiftyJSON內(nèi)部會自動對optional(可選類型)進行拆包(Wrapping ),大大簡化了代碼。下面通過幾個樣例作為演示。(本文代碼均已升級至?Swift3)
(1)比如我們有一個如下的JSON數(shù)據(jù),表示聯(lián)系人集合:
| 1234567891011121314151617181920212223242526 | [????{????????"name":?"hangge",?????????"age": 100,?????????"phones": [????????????{????????????????"name":?"公司",?????????????????"number":?"123456"????????????},?????????????{????????????????"name":?"家庭",?????????????????"number":?"001"????????????}????????]????},????{????????"name":?"big boss",?????????"age": 1,?????????"phones": [????????????{????????????????"name":?"公司",?????????????????"number":?"111111"????????????}????????]????}] | 
| 12345 | 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解析
比如我們要取第一條聯(lián)系人的第一個電話號碼,每個級別都判斷就很麻煩,代碼如下:
| 1234567 | 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("第一個聯(lián)系人的第一個電話號碼:",number)} | 
| 123456 | 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("第一個聯(lián)系人的第一個電話號碼:",number)} | 
(3)使用SwiftyJSON解析:
不用擔(dān)心數(shù)組越界,不用判斷節(jié)點,拆包什么的,代碼如下:
| 12345 | let?json =?JSON(data: jsonData)if?let?number = json[0]["phones"][0]["number"].string {????// 找到電話號碼????print("第一個聯(lián)系人的第一個電話號碼:",number)} | 
| 12345678 | let?json =?JSON(data: jsonData)if?let?number = json[0]["phones"][0]["number"].string {????// 找到電話號碼????print("第一個聯(lián)系人的第一個電話號碼:",number)}else?{????// 打印錯誤信息????print(json[0]["phones"][0]["number"])} | 
3,獲取網(wǎng)絡(luò)數(shù)據(jù),并使用SwiftyJSON解析
除了解析本地的JSON數(shù)據(jù),我們其實更常通過url地址獲取遠(yuǎn)程數(shù)據(jù)并解析。
(1)與URLSession結(jié)合
| 1234567891011121314151617181920 | //創(chuàng)建URL對象let?url =?URL(string:"http://www.hangge.com/getJsonData.php")//創(chuàng)建請求對象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("第一個聯(lián)系人的第一個電話號碼:",number)????????????????????????????}????????????????????????}})?as?URLSessionTask//使用resume方法啟動任務(wù)dataTask.resume() | 
(2)與Alamofire結(jié)合
| 1234567891011121314151617 | //創(chuàng)建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("第一個聯(lián)系人的第一個電話號碼:",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等方法獲取到的是可選擇值,我們需要自行判斷是否存在,同時不存在的話可以獲取具體的錯誤信息。
| 123456789101112131415 | //intif?let?age = json[0]["age"].int {????print(age)}?else?{????//打印錯誤信息????print(json[0]["age"])}?????//Stringif?let?name = json[0]["name"].string {????print(name)}?else?{????//打印錯誤信息????print(json[0]["name"])} | 
使用?xxxValue?這樣的屬性獲取值,如果沒獲取到的話會返回一個默認(rèn)值。省得我們再判斷拆包了。
| 1234567891011 | //If not a Number or nil, return 0let?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)獲取原始數(shù)據(jù)(Raw object)
| 123456789101112131415161718192021 | let?jsonObject = json.object?as?AnyObjectlet?jsonObject = json.rawValue??as?AnyObject//JSON轉(zhuǎn)化為Datalet?data = json.rawData()//JSON轉(zhuǎn)化為String字符串if?let?string = json.rawString() {????//Do something you want}//JSON轉(zhuǎn)化為Dictionary字典([String: AnyObject]?)if?let?dic = json.dictionaryObject {????//Do something you want}//JSON轉(zhuǎn)化為Array數(shù)組([AnyObject]?)if?let?arr = json.arrayObject {????//Do something you want} | 
5,設(shè)置值
| 1234 | json[0]["age"].int =? 101json[0]["name"].string =??"hangge.com"json[0]["phones"].arrayObject = [["name":"固話",?"number":110],["name":"手機",?"number":120]]json[0]["phones"][0].dictionaryObject = ["name":"固話",?"number":100] | 
6,下標(biāo)訪問(Subscript)
可以通過數(shù)字、字符串、數(shù)組類型的下標(biāo)訪問JSON數(shù)據(jù)的層級與屬性。比如下面三種方式的結(jié)果都是一樣的:
| 123456789 | //方式1let?number = json[0]["phones"][0]["number"].stringValue?????//方式2let?number = json[0,"phones",0,"number"].stringValue?????//方式3let?keys:[JSONSubscriptType] = [0,"phones",0,"number"]let?number = json[keys].stringValue | 
7,循環(huán)遍歷JSON對象中的所有數(shù)據(jù)
(1)如果JSON數(shù)據(jù)是數(shù)組類型(Array)
| 123 | for?(index,subJson):(String,?JSON)?in?json {????print("\(index):\(subJson)")} | 
(2)如果JSON數(shù)據(jù)是字典類型(Dictionary)
| 123 | for?(key,subJson):(String,?JSON)?in?json[0] {????print("\(key):\(subJson)")} | 
8,構(gòu)造創(chuàng)建JSON對象數(shù)據(jù)
(1)空的JSON對象
| 1 | let?json:?JSON?=??nil | 
(2)使用簡單的數(shù)據(jù)類型創(chuàng)建JSON對象
| 1234567891011 | //StringLiteralConvertiblelet?json:?JSON?=?"I'm a son"//IntegerLiteralConvertiblelet?json:?JSON?=? 12345//BooleanLiteralConvertiblelet?json:?JSON?=??true//FloatLiteralConvertiblelet?json:?JSON?=? 2.8765 | 
(3)使用數(shù)組或字典數(shù)據(jù)創(chuàng)建JSON對象
| 123456789101112 | //DictionaryLiteralConvertiblelet?json:?JSON?=? ["I":"am",?"a":"son"]//ArrayLiteralConvertiblelet?json:?JSON?=? ["I",?"am",?"a",?"son"]//Array & Dictionaryvar?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" | 
原文出自: www.hangge.com ??轉(zhuǎn)載請保留原文鏈接: http://www.hangge.com/blog/cache/detail_968.html
總結(jié)
以上是生活随笔為你收集整理的SwiftyJSON的使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Swift 使用SwiftyJSON解析
- 下一篇: 7天连锁酒店郑南雁:顺势创业者无为管理人
