SwiftyJSON的使用詳解

1托呕,SwiftyJSON介紹與配置

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

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

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

2励翼,SwiftyJSON的優(yōu)點(diǎn)

NSJSONSerializationSwiftyJSON相比蜈敢,在獲取多層次結(jié)構(gòu)的JSON數(shù)據(jù)時。SwiftyJSON不需要一直判斷這個節(jié)點(diǎn)是否存在抚笔,是不是我們想要的class扶认,下一個節(jié)點(diǎn)是否存在,是不是我們想要的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é)點(diǎn)持偏,拆包什么的驼卖,代碼如下:

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ù)卿叽,我們其實(shí)更常通過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)可選值獲瓤加ぁ(Optional 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)系作者
  • 序言:七十年代末谢床,一起剝皮案震驚了整個濱河市兄一,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌识腿,老刑警劉巖瘾腰,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異覆履,居然都是意外死亡蹋盆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門硝全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栖雾,“玉大人,你說我怎么就攤上這事伟众∥雠海” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵凳厢,是天一觀的道長账胧。 經(jīng)常有香客問我,道長先紫,這世上最難降的妖魔是什么治泥? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮遮精,結(jié)果婚禮上居夹,老公的妹妹穿的比我還像新娘。我一直安慰自己本冲,他們只是感情好准脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檬洞,像睡著了一般狸膏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上添怔,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天湾戳,我揣著相機(jī)與錄音闷板,去河邊找鬼。 笑死院塞,一個胖子當(dāng)著我的面吹牛遮晚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拦止,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼县遣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汹族?” 一聲冷哼從身側(cè)響起萧求,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顶瞒,沒想到半個月后夸政,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榴徐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年守问,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑资。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耗帕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袱贮,到底是詐尸還是另有隱情仿便,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布攒巍,位于F島的核電站嗽仪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柒莉。R本人自食惡果不足惜闻坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望常柄。 院中可真熱鬧鲤氢,春花似錦、人聲如沸西潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喷市。三九已至,卻和暖如春威恼,著一層夾襖步出監(jiān)牢的瞬間品姓,已是汗流浹背寝并。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹备,地道東北人衬潦。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像植酥,于是被迫代替她去往敵國和親镀岛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 原文出處:鏈接 GitHub地址 1)比如我們有一個如下的JSON數(shù)據(jù)友驮,表示聯(lián)系人集合: [ { "name":...
    星空夢想閱讀 972評論 0 0
  • 1漂羊,SwiftyJSON介紹與配置 SwiftyJSON是個使用Swift語言編寫的開源庫,可以讓我們很方便地處理...
    Buddha_like閱讀 2,839評論 1 2
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,278評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理卸留,服務(wù)發(fā)現(xiàn)走越,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 01-常量與變量 學(xué)習(xí)swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔閱讀 5,146評論 2 19