SwiftyJSON的使用詳解

1,SwiftyJSON介紹與配置

SwiftyJSON是個使用Swift語言編寫的開源庫,可以讓我們很方便地處理JSON數(shù)據(jù)(解析數(shù)據(jù)、生成數(shù)據(jù))。

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

使用配置:直接SwiftyJSON.swift添加到項目中即可。

2,SwiftyJSON的優(yōu)點

NSJSONSerializationSwiftyJSON相比,在獲取多層次結(jié)構(gòu)的JSON數(shù)據(jù)時。SwiftyJSON不需要一直判斷這個節(jié)點是否存在,是不是我們想要的class,下一個節(jié)點是否存在,是不是我們想要的class…。同時,SwiftyJSON內(nèi)部會自動對optional(可選類型)進(jìn)行拆包(Wrapping ),大大簡化了代碼。

(1)比如我們有一個如下的JSON數(shù)據(jù),表示聯(lián)系人集合:


[

{

"name":"hangge",

"age": 100,

"phones": [

{

"name":"公司",

"number":"123456"

},

{

"name":"家庭",

"number":"001"

}

? ? ? ? ? ? ? ? ?]

},

{

"name":"big boss",

"age": 1,

"phones": [

{

"name":"公司",

"number":"111111"

}

? ? ? ? ? ? ? ? ? ]

}

]

為便于測試比較,我們先將JSON格式的字符串轉(zhuǎn)為NSData:

letjsonStr ="[{\"name\": \"hangge\", \"age\": 100, \"phones\": [{\"name\": \"公司\",\"number\": \"123456\"}, {\"name\": \"家庭\",\"number\": \"001\"}]}, {\"name\": \"big boss\",\"age\": 1,\"phones\": [{ \"name\": \"公司\",\"number\": \"111111\"}]}]"

ifletjsonData = jsonStr.dataUsingEncoding(NSUTF8StringEncoding,

allowLossyConversion:false) {

//.........

}

(2)使用NSJSONSerializationSwiftyJSON解析

比如我們要取第一條聯(lián)系人的第一個電話號碼,每個級別都判斷就很麻煩,代碼如下:

if let userArray = try?NSJSONSerialization.JSONObjectWithData(jsonData,

options: .AllowFragments)as? [[String:AnyObject]],

letphones = userArray?[0]["phones"]as? [[String:AnyObject]],

letnumber = phones[0]["number"]as?String{

// 找到電話號碼

print("第一個聯(lián)系人的第一個電話號碼:",number)

}

即使使用optional來簡化一下,代碼也不少:

if let userArray = try?NSJSONSerialization.JSONObjectWithData(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é)點,拆包什么的,代碼如下:

let json =JSON(data: jsonData)

if let number = json[0]["phones"][0]["number"].string {

// 找到電話號碼

print("第一個聯(lián)系人的第一個電話號碼:",number)

}

如果沒取到值,還可以走到錯誤處理來了,打印一下看看錯在哪:

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)與NSURLSession結(jié)合

//創(chuàng)建NSURL對象

let url String:String="http://www.hangge.com/getJsonData.php"

let url:NSURL! =NSURL(string:urlString)

//創(chuàng)建請求對象

let request:NSURLRequest=NSURLRequest(URL: url)

let session =NSURLSession.sharedSession()

let dataTask = session.dataTaskWithRequest(request,

completionHandler: {(data, response, error) ->Voidin

if error !=nil{

print(error?.code)

print(error?.description)

}else{

let json =JSON(data: data!)

if let number = json[0]["phones"][0]["number"].string {

// 找到電話號碼

print("第一個聯(lián)系人的第一個電話號碼:",number)

}

}

})asNSURLSessionTask

//使用resume方法啟動任務(wù)

dataTask.resume()

(2)與Alamofire結(jié)合

//創(chuàng)建NSURL對象

let urlString:String="http://www.hangge.com/code/test.php"

let url:NSURL! =NSURL(string:urlString)

Alamofire.request(.GET, url).validate().responseJSON { responsein

switchresponse.result {

case.Success:

if let value = response.result.value {

let json =JSON(value)

if let number = json[0]["phones"][0]["number"].string {

// 找到電話號碼

print("第一個聯(lián)系人的第一個電話號碼:",number)

}

}

case.Failure(leterror):

print(error)

}

}

4,獲取值

(1)可選值獲?。∣ptional getter)

通過.number、.string、.bool、.int、.uInt、.float、.double、.array、.dictionary、int8、Uint8、int16、Uint16、int32、Uint32、int64、Uint64等方法獲取到的是可選擇值,我們需要自行判斷是否存在,同時不存在的話可以獲取具體的錯誤信息

//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這樣的屬性獲取值,如果沒獲取到的話會返回一個默認(rèn)值。省得我們再判斷拆包了。

//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[0]["phones"].arrayValue

//If not a Dictionary or nil, return [:]

let phone:Dictionary = json[0]["phones"][0].dictionaryValue

(3)獲取原始數(shù)據(jù)(Raw object)

let jsonObject:AnyObject= json.object

if let jsonObject:AnyObject= json.rawValue

//JSON轉(zhuǎn)化為NSData

if let data = json.rawData() {

//Do something you want

}

//JSON轉(zhuǎn)化為String字符串

if let string = json.rawString() {

//Do something you want

}

5,設(shè)置值

json[0]["age"].int =? 101

json[0]["name"].string ="hangge.com"

json[0]["phones"].arrayObject = [["name":"固話","number":110],["name":"手機(jī)","number":120]]

json[0]["phones"][0].dictionaryObject = ["name":"固話","number":100]

6,下標(biāo)訪問(Subscript)

可以通過數(shù)字、字符串、數(shù)組類型的下標(biāo)訪問JSON數(shù)據(jù)的層級與屬性。比如下面三種方式的結(jié)果都是一樣的:

//方式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,循環(huán)遍歷JSON對象中的所有數(shù)據(jù)

(1)如果JSON數(shù)據(jù)是數(shù)組類型(Array)

for(index,subJson):(String,JSON)injson {

print("\(index):\(subJson)")

}

(2)如果JSON數(shù)據(jù)是字典類型(Dictionary)

for(key,subJson):(String,JSON)injson[0] {

print("\(key):\(subJson)")

}

8,構(gòu)造創(chuàng)建JSON對象數(shù)據(jù)

(1)空的JSON對象

let json:JSON=nil

(2)使用簡單的數(shù)據(jù)類型創(chuàng)建JSON對象

//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)使用數(shù)組或字典數(shù)據(jù)創(chuàng)建JSON對象

//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 = ["list",3,"what"]

json[path] ="that"

原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接:http://www.hangge.com/blog/cache/detail_968.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容