SwiftyJSON使用

1,SwiftyJSON介紹與配置

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

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

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

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

2贱鄙,SwiftyJSON的優(yōu)點

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

下面通過幾個樣例作為演示引有。(本文代碼均已升級至Swift3)

(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)為Data:

ifletuserArray = try?JSONSerialization.jsonObject(with: jsonData,

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

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

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

// 找到電話號碼

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

}

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

ifletuserArray = try?JSONSerialization.jsonObject(with: jsonData,

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

letnumber = (userArray?[0]["phones"]as? [[String:AnyObject]])?[0]["number"]as?String{

// 找到電話號碼

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

}

(3)使用SwiftyJSON解析:

不用擔(dān)心數(shù)組越界弄捕,不用判斷節(jié)點僻孝,拆包什么的,代碼如下:

letjson =JSON(data: jsonData)

ifletnumber = json[0]["phones"][0]["number"].string {

// 找到電話號碼

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

}

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

letjson =JSON(data: jsonData)

ifletnumber = 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é)合

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

leturl =URL(string:"http://www.hangge.com/getJsonData.php")

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

letrequest =URLRequest(url: url!)

letdataTask =URLSession.shared.dataTask(with: request,

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

iferror !=nil{

print(error)

}else{

letjson =JSON(data: data!)

ifletnumber = json[0]["phones"][0]["number"].string {

// 找到電話號碼

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

}

}

})asURLSessionTask

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

dataTask.resume()

(2)與Alamofire結(jié)合

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

leturl =URL(string:"http://www.hangge.com/getJsonData.php")!

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

switchresponse.result.isSuccess {

casetrue:

ifletvalue = response.result.value {

letjson =JSON(value)

ifletnumber = json[0]["phones"][0]["number"].string {

// 找到電話號碼

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

}

}

casefalse:

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等方法獲取到的是可選擇值,我們需要自行判斷是否存在帅霜,同時不存在的話可以獲取具體的錯誤信息匆背。

//int

ifletage = json[0]["age"].int {

print(age)

}else{

//打印錯誤信息

print(json[0]["age"])

}

//String

ifletname = 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

letage:Int= json[0]["age"].intValue

//If not a String or nil, return ""

letname:String= json[0]["name"].stringValue

//If not a Array or nil, return []

letlist:Array = json[0]["phones"].arrayValue

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

letphone:Dictionary = json[0]["phones"][0].dictionaryValue

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

letjsonObject = json.objectasAnyObject

letjsonObject = json.rawValueasAnyObject

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

letdata = json.rawData()

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

ifletstring = json.rawString() {

//Do something you want

}

//JSON轉(zhuǎn)化為Dictionary字典([String: AnyObject]?)

ifletdic = json.dictionaryObject {

//Do something you want

}

//JSON轉(zhuǎn)化為Array數(shù)組([AnyObject]?)

ifletarr = json.arrayObject {

//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

letnumber = json[0]["phones"][0]["number"].stringValue

//方式2

letnumber = json[0,"phones",0,"number"].stringValue

//方式3

letkeys:[JSONSubscriptType] = [0,"phones",0,"number"]

letnumber = 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)

1

2

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

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

}

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

(1)空的JSON對象

1.letjson:JSON=nil

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

//StringLiteralConvertible

letjson:JSON="I'm a son"

//IntegerLiteralConvertible

letjson:JSON=? 12345

//BooleanLiteralConvertible

letjson:JSON=true

//FloatLiteralConvertible

letjson:JSON=? 2.8765

(3)使用數(shù)組或字典數(shù)據(jù)創(chuàng)建JSON對象

letjson:JSON=? ["I":"am","a":"son"]

//ArrayLiteralConvertible

letjson:JSON=? ["I","am","a","son"]

//Array & Dictionary

varjson:JSON=? ["name":"Jack","age": 25,"list": ["a","b","c", ["what":"this"]]]

json["list"][3]["what"] ="that"

json["list",3,"what"] ="that"

letpath:[JSONSubscriptType] = ["list",3,"what"]

json[path] ="that"

尊重原作者,重要的事說三遍:

注:閱讀原文請自行跳轉(zhuǎn):http://www.hangge.com/blog/cache/detail_968.html

注:閱讀原文請自行跳轉(zhuǎn):http://www.hangge.com/blog/cache/detail_968.html

注:閱讀原文請自行跳轉(zhuǎn):http://www.hangge.com/blog/cache/detail_968.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穴翩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锦积,更是在濱河造成了極大的恐慌芒帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丰介,死亡現(xiàn)場離奇詭異背蟆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哮幢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門带膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橙垢,你說我怎么就攤上這事本砰。” “怎么了钢悲?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵点额,是天一觀的道長舔株。 經(jīng)常有香客問我,道長还棱,這世上最難降的妖魔是什么载慈? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮珍手,結(jié)果婚禮上办铡,老公的妹妹穿的比我還像新娘。我一直安慰自己琳要,他們只是感情好寡具,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稚补,像睡著了一般童叠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上课幕,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天厦坛,我揣著相機(jī)與錄音,去河邊找鬼乍惊。 笑死杜秸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的润绎。 我是一名探鬼主播撬碟,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莉撇!你這毒婦竟也來了呢蛤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤稼钩,失蹤者是張志新(化名)和其女友劉穎顾稀,沒想到半個月后达罗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝撑,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年粮揉,在試婚紗的時候發(fā)現(xiàn)自己被綠了巡李。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡扶认,死狀恐怖侨拦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辐宾,我是刑警寧澤狱从,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布膨蛮,位于F島的核電站,受9級特大地震影響季研,放射性物質(zhì)發(fā)生泄漏敞葛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一与涡、第九天 我趴在偏房一處隱蔽的房頂上張望惹谐。 院中可真熱鬧,春花似錦驼卖、人聲如沸氨肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎囚。三九已至,卻和暖如春檩奠,著一層夾襖步出監(jiān)牢的瞬間桩了,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工埠戳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留井誉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓整胃,卻偏偏與公主長得像颗圣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屁使,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • 1在岂,SwiftyJSON介紹與配置 SwiftyJSON是個使用Swift語言編寫的開源庫,可以讓我們很方便地處理...
    twitter_me閱讀 15,094評論 4 10
  • 原文出處:鏈接 GitHub地址 1)比如我們有一個如下的JSON數(shù)據(jù)蛮寂,表示聯(lián)系人集合: [ { "name":...
    星空夢想閱讀 974評論 0 0
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,297評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蔽午,服務(wù)發(fā)現(xiàn),斷路器酬蹋,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • 談到“選擇”范抓,上周我邀請來一起直播的管理咨詢專家姚詩豪骄恶,有一篇文章講到這個話題,面對兩難局面匕垫,該如何做出更合適的選...
    劉軒在簡書閱讀 13,227評論 16 126