我眼中的開源庫源碼之JSONModel(一)

JSONModel 一個解析 JSON 數(shù)據(jù)的開源庫,可以將 JSON 數(shù)據(jù)直接解析成自定義的 model ,其中對數(shù)據(jù)類型的檢查和對數(shù)據(jù)類型的轉(zhuǎn)換比較貼心。最近在項目中使用了以后覺得確實(shí)方便很多,推薦給大家。(PS:由于實(shí)現(xiàn)的原理在swift中并不支持,所以swift代碼了解就可以)。

國際慣例介紹下背景,曾經(jīng)有一段時間一直要寫接口,自然少不了解析獲得的 JSON 數(shù)據(jù),覺得真的是一種非常機(jī)械重復(fù)的過程,懵懵懂懂的寫一個基于 runtime 的解析器,感覺用起來方便了不少,但是在錯誤處理和一些特殊情況下使用起來還是覺得有一些不靈活。多年以后偶然的機(jī)會又遇到了相同的工作,解析 JSON 數(shù)據(jù),這次選擇了相對討巧的辦法,使用成熟的開源庫來解決。想起那句話“知其然,知其所以然”,決定深入的分析下,把我的理解也分享給大家。

先從使用說起吧,使用 JSONModel 非常簡單,只需要將你的 model 類繼承自 JSONModel ,而同時 model 中的屬性名又恰巧可以和 JSON 數(shù)據(jù)中的 key 名字一樣的話,那么非常恭喜你,你的工作已經(jīng)完成90%。如果你還有特殊需求實(shí)際上寫起來也非常方便,我覺得完全可以覆蓋日常90%的工作。其他的功能我們會在分析源碼的時候看到。

JSONModel 不只使用非常方便而且還會幫你檢查 JSON 數(shù)據(jù)的完整性,如果 JSON 數(shù)據(jù)不完整的話是要返回 nil 的。它還提供了基本的數(shù)據(jù)類型轉(zhuǎn)換,比如服務(wù)器錯將數(shù)字傳成字符串的話 JSONModel 也會幫你轉(zhuǎn)換成你期望的類型。好啦,廣告做到這里,請相關(guān)部門去收一下廣告費(fèi)。

先看一下文件結(jié)構(gòu),無視掉網(wǎng)絡(luò)相關(guān)的類是這樣的

既然我們是繼承自JSONModel,那我們就看看JSONModel

頭文件分成三部分: 1) Property protocol 2) AbstractJSONModelProtocol 3) JSONModel

第一部分 Property protocol

@protocol Ignore

@end

我們看到的只是4個空的協(xié)議 Ignore,Optional,Index,ConvertOnDemand,分別對應(yīng)的四種使用方法,忽略、可選、排序、延遲加載,粗看起來貌似都是空的協(xié)議沒有什么實(shí)際的使用價值,但是我覺得正是作者代碼精彩之處,我們都知道在 runtime 系統(tǒng)中,每一個對象實(shí)例都有一個isa指針(PS:新的 runtime 命名可能有些變化,但是原理相通)指向的是該實(shí)例變量的 Class 對象,進(jìn)而得到該實(shí)例對象的所有信息。而 JSONModel 正是利用 runtime 系統(tǒng)的這個特性進(jìn)行解析數(shù)據(jù)的,在Class對象中我們可以獲得屬性的相關(guān)描述也包括了其符合的協(xié)議,這樣這四個空協(xié)議就起到了畫龍點(diǎn)睛的作用,靈活度直線提高。比如在解析JSON的時候我們發(fā)現(xiàn)其某些屬性符合Igonre就不會解析該屬性,其他的協(xié)議同理。美中不足由于swift中對這種機(jī)制支持的并不友好所以JSONModel應(yīng)該不太適用。

還有最后一點(diǎn)作者非常貼心的實(shí)現(xiàn)兩個Category為了防止編譯器的警告,大家也可以參考一下這種寫法。

第二部分 AbstractJSONModelProtocol

是 JSONModel 符合的抽象協(xié)議。如果你的類也符合該協(xié)議, 可以理解于是和JSONModel一樣的,可以將不繼承自 JSONModel 的類當(dāng)作屬性一起解析,一般還是推薦繼承自 JSONModel 不然里面很多細(xì)節(jié)都要你自己去實(shí)現(xiàn)。

第三部分 JSONModel

-(instancetype)initWithString:(NSString*)string error:(JSONModelError**)err;

-(instancetype)initWithString:(NSString *)string usingEncoding:(NSStringEncoding)encoding error:(JSONModelError**)err;

-(instancetype)initWithDictionary:(NSDictionary*)dict error:(NSError **)err;

-(instancetype)initWithData:(NSData *)data error:(NSError **)error;

四個初始化方法,實(shí)際上最后都是使用initWithDictionary來實(shí)現(xiàn)的。具體實(shí)現(xiàn)可以參考代碼

順便提一下instancetype這個類型是蘋果為了解決我們在繼承的時候,返回類型的問題,如果你沒有沒有遇到或者不了解可以注意下。這樣寫避免了一直被詬病的反悔 id 類型,感興趣可以自己查一下相關(guān)的資料。

還有一些方便的方法暫時不提,還有幾個可以重載的方法.

+(JSONKeyMapper*)keyMapper;

keyMapper? 這個是解決JSON中的key和屬性名字對應(yīng)不上時使用的。只對該類生效

setGlobalKeyMapper 這個mapper和keyMapper作用一樣只是對所有的JSONModel的子類都生效的一個對應(yīng)關(guān)系

propertyIsOptional 和propertyIsIgnored 是協(xié)議的方法版,設(shè)想你有1000個屬性要寫明這兩個協(xié)議你會不會瘋掉。也許直接返回一個YES或者NO就能解決問題對吧。

歡迎來二一個灌水

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,480評論 2 379

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

  • 我們接著上回的思路看,上面第一行就是一個條件編譯。 #if !__has_feature(objc_arc)#er...
    lxyeslxlx11閱讀 803評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,170評論 4 61
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,825評論 18 139
  • 兒子,你的十二年寒窗終于走到盡頭了,明天,你將會和近干萬的高三學(xué)子一起走向人生第一個重大的戰(zhàn)場。而此時,竟然有諸多...
    沙漠里的夕陽閱讀 207評論 0 1
  • 有一段時間喜歡在圖書館里閑逛,各個書架間穿梭,專門找那種薄薄冊、名字有趣的書來讀。一次,偶然翻到了柳美里的《私...
    陳十五閱讀 1,157評論 5 9