HandyJSON簡單使用

一、HandyJSON簡介

HandyJSON 是阿里開發(fā)的一個(gè)在swift上把JSON數(shù)據(jù)轉(zhuǎn)化為對(duì)應(yīng)model的框架。與其他流行的Swift JSON庫相比蓖柔,HandyJSON的特點(diǎn)是署隘,它支持純swift類蓬戚,使用也簡單喉脖。它反序列化時(shí)(把JSON轉(zhuǎn)換為Model)不要求Model從NSObject繼承(因?yàn)樗皇腔贙VC機(jī)制)椰苟,也不要求你為Model定義一個(gè)Mapping函數(shù)。只要你定義好Model類树叽,聲明它服從HandyJSON協(xié)議舆蝴,HandyJSON就能自行以各個(gè)屬性的屬性名為Key,從JSON串中解析值题诵。不過因?yàn)镠andyJSON是基于swift的metadata來做的洁仗,如果swift的metadata的結(jié)構(gòu)改了,HandyJSON可能就直接不能用了性锭。當(dāng)然阿里一直在維護(hù)這個(gè)框架赠潦,swift的源碼有變化,相信框架也是相對(duì)于有改變的草冈。github地址她奥。

二、HandyJSON導(dǎo)入項(xiàng)目

1疲陕、當(dāng)然最簡單的方式用cocoapod的方式導(dǎo)入啦

      podfile文件里加入:pod 'HandyJSON', '~> 5.0.2'
      然后執(zhí)行pod install

2方淤、如果使用的是Carthage,也很簡單

     github "alibaba/HandyJSON" ~> 5.0.2

三蹄殃、HandyJSON簡單使用

1携茂、這里主要有幾種簡單的json字符串轉(zhuǎn)對(duì)應(yīng)model的情況。先直接展示model類的代碼

import UIKit
import HandyJSON

class Person: HandyJSON {
    var doubleOptional: Double?
    var stringImplicitlyUnwrapped: String = ""
    var int:Int?
    var name: String?
    
    required init(){} // 必須實(shí)現(xiàn)一個(gè)空的初始化方法
}

class Component: HandyJSON {
    var num: Int?
    var comp1: SubComponent?
    var comp2: SubComponent?
    
    required init(){}
}

class ComponentArr: HandyJSON {
    var num: Int?
    var compArr: [SubComponent]?
    
    required init(){}
}

class SubComponent: HandyJSON {
    var aInt: Int?
    var aString: String = ""
    
    required init(){}
}

//let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"friend\":{\"id\":54321,\"name\":\"Lily\"}}"

class Cat: HandyJSON {
    var id: Int64!
    var name: String!
    var friendName: String?

    required init() {}
    
    func mapping(mapper: HelpingMapper) {
        // 把id轉(zhuǎn)換為json數(shù)據(jù)里的key:cat_id诅岩,friendName轉(zhuǎn)化為讀json數(shù)據(jù)里的friend字典中的name字段讳苦。
        mapper <<<
            self.id <-- "cat_id"
    
        mapper <<<
            self.friendName <-- "friend.name"
    }
}

2、對(duì)應(yīng)使用的HandyJSON的代碼例子

1吩谦、簡單的解析鸳谜,包括model中有json里不存在的,json中也有model里不存在的內(nèi)容

func parse1() {
        // 簡單的解析
        let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1,\"msg\":\"world\"}"
        if let p: Person = Person.deserialize(from: jsonString){
            print(p.doubleOptional!)
            print(p.stringImplicitlyUnwrapped)
            print(p.int!)
            //print(p.name)
        }else{
            print("解析失敗")
        }
    }

2式廷、包含對(duì)象嵌套的解析

func parse2() {
        let jsonString = "{\"num\":12345,\"comp1\":{\"aInt\":1,\"aString\":\"aaaaa\"},\"comp2\":{\"aInt\":2,\"aString\":\"bbbbb\"}}"
        if let mainCom: Component = Component.deserialize(from: jsonString)  {
            print(mainCom.num!)
        }
    }

3咐扭、包含數(shù)組對(duì)象的解析

func parse3 () {
        let jsonString = "{\"num\":12345,\"compArr\":[{\"aInt\":1,\"aString\":\"aaaaa\"},{\"aInt\":2,\"aString\":\"bbbbb\"}]}"
        if let mainCom: ComponentArr = ComponentArr.deserialize(from: jsonString)  {
            print(mainCom.num!)
            for com in mainCom.compArr! {
                print(com.aInt!)
                print(com.aString)
            }
        }
    }

4、 把字典轉(zhuǎn)成對(duì)象

func parse4 () {
        var dict = [String: Any]()
        dict["doubleOptional"] = 1.1
        dict["stringImplicitlyUnwrapped"] = "hello"
        dict["int"] = 1
        
        if let p: Person = Person.deserialize(from: dict) {
            print(p.doubleOptional!)
            print(p.stringImplicitlyUnwrapped)
            print(p.int!)
            print(p.name) // 字典里沒有對(duì)應(yīng)的值滑废,為nil
        }
    }

5蝗肪、 包含自定義解析:當(dāng)model的屬性名和json里的對(duì)應(yīng)不上的時(shí)候,model里實(shí)現(xiàn)mapping函數(shù)去對(duì)應(yīng)key蠕趁。

func parse5() {
        let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"parent\":\"Tom/Lily\",\"friend\":{\"id\":54321,\"name\":\"Lily\"}}"
        
        if let cat: Cat = Cat.deserialize(from: jsonString) {
            print(cat);
        }
    }

推薦一下文章
http://www.reibang.com/p/0f060be5c35a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薛闪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俺陋,更是在濱河造成了極大的恐慌豁延,老刑警劉巖昙篙,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诱咏,居然都是意外死亡苔可,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門胰苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕蛹,“玉大人醇疼,你說我怎么就攤上這事硕并。” “怎么了秧荆?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵倔毙,是天一觀的道長。 經(jīng)常有香客問我乙濒,道長陕赃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任颁股,我火速辦了婚禮么库,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甘有。我一直安慰自己诉儒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布亏掀。 她就那樣靜靜地躺著忱反,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滤愕。 梳的紋絲不亂的頭發(fā)上温算,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音间影,去河邊找鬼注竿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魂贬,可吹牛的內(nèi)容都是我干的巩割。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼随橘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼喂分!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起机蔗,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤蒲祈,失蹤者是張志新(化名)和其女友劉穎甘萧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梆掸,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬卷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酸钦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怪得。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卑硫,靈堂內(nèi)的尸體忽然破棺而出徒恋,到底是詐尸還是另有隱情,我是刑警寧澤欢伏,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布入挣,位于F島的核電站,受9級(jí)特大地震影響硝拧,放射性物質(zhì)發(fā)生泄漏径筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一障陶、第九天 我趴在偏房一處隱蔽的房頂上張望滋恬。 院中可真熱鬧,春花似錦抱究、人聲如沸恢氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酿雪。三九已至,卻和暖如春侄刽,著一層夾襖步出監(jiān)牢的瞬間指黎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工州丹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醋安,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓墓毒,卻偏偏與公主長得像吓揪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子所计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345