iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法
在iOS開(kāi)發(fā)過(guò)程中經(jīng)常需要與服務(wù)器進(jìn)行數(shù)據(jù)通訊,Json就是一種常用的高效簡(jiǎn)潔的數(shù)據(jù)格式。
JSON建構(gòu)有兩種結(jié)構(gòu):
json簡(jiǎn)單說(shuō)就是javascript中的對(duì)象和數(shù)組,所以這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組2種結(jié)構(gòu),通過(guò)這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)
1、對(duì)象:對(duì)象在js中表示為“{}”擴(kuò)起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key:value,key:value,...}的鍵值對(duì)的結(jié)構(gòu),在面向?qū)ο蟮恼Z(yǔ)言中,key為對(duì)象的屬性,value為對(duì)應(yīng)的屬性值,所以很容易理解,取值方法為對(duì)象.key 獲取屬性值,這個(gè)屬性值的類(lèi)型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。
2、數(shù)組:數(shù)組在js中是中括號(hào)“[]”擴(kuò)起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java","javascript","vb",...],取值方式和所有語(yǔ)言中一樣,使用索引獲取,字段值的類(lèi)型可以是數(shù)字、字符串、數(shù)組、對(duì)象幾種。
經(jīng)過(guò)對(duì)象、數(shù)組2種結(jié)構(gòu)就可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了。
問(wèn)題現(xiàn)象
但是幾個(gè)項(xiàng)目下來(lái)一直遇到一個(gè)坑爹的問(wèn)題,程序在獲取某些數(shù)據(jù)之后莫名崩潰。其實(shí)很早就發(fā)現(xiàn)了原因:由于服務(wù)器的數(shù)據(jù)庫(kù)中有些字段為空,然后以Json形式返回給客戶(hù)端時(shí)就會(huì)出現(xiàn)這樣的數(shù)據(jù):
"somevalue":null
通過(guò)JsonKit 這個(gè)第三方庫(kù)解析出來(lái)的數(shù)據(jù)就成了
somevalue = "<null>";
這個(gè)數(shù)據(jù)類(lèi)型不是nil 也不是 String。 解析成對(duì)象之后,如果直接向這個(gè)對(duì)象發(fā)送消息(eg:length,count 等等)就會(huì)直接崩潰。提示錯(cuò)誤為:
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
解決方法
其實(shí)一直沒(méi)有找到完美的解決辦法,坑了我很久。
1、最開(kāi)始的解決方法就是為了應(yīng)付當(dāng)前遇到的崩潰,看看哪個(gè)字段可能為空,那么就對(duì)該字段使用前進(jìn)行判斷,通過(guò)崩潰時(shí)的錯(cuò)誤提示可以看出,這樣的字段解析成的對(duì)象是 NSNull 類(lèi)型的,所以可以直接判斷是不是此類(lèi)型:
if (![isKindOfClass:[NSNull class]]){xxxxxxx;}
因?yàn)樽侄螌?shí)在太多,就找一個(gè)補(bǔ)一個(gè)。
2、后來(lái)想徹底解決這問(wèn)題,就打算從數(shù)據(jù)源下手,其實(shí)應(yīng)該可以用正則表達(dá)式匹配這個(gè)null ,然后進(jìn)行替換,奈何正則是我的硬傷啊。于是就相出了一個(gè)山寨方法:字符串匹配。在獲取到服務(wù)器返回的Json時(shí),返回結(jié)果時(shí)string對(duì)象,于是就先替換 null 為 為空字符””,然后再解析。
json = [jsonStr stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];
這個(gè)方法本來(lái)很奏效,但是我這里的服務(wù)器返回極不簡(jiǎn)潔,各種垃圾數(shù)據(jù)(不吐槽這了)。。。反正這樣會(huì)導(dǎo)致json無(wú)法解析了。
3、最后沒(méi)有辦法,只能在解析的時(shí)候下手,把是NSNull 類(lèi)型的值替換成nil。 一般就寫(xiě)個(gè)tool方法,然后解析時(shí)調(diào)用。但是嫌太麻煩,就想弄寫(xiě)個(gè)宏,通過(guò)搜索驚奇的發(fā)現(xiàn)宏也是可以有返回值的,結(jié)果如下:
#define VerifyValue(value)\
({id tmp;\
if ([value isKindOfClass:[NSNull class]])\
tmp = nil;\
else\
tmp = value;\
tmp;\
})\
宏里的最后一句語(yǔ)句便是返回值。然后在解析數(shù)據(jù)時(shí)調(diào)用宏:
contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);
4、如果你使用AFNetwork 這個(gè)庫(kù)做網(wǎng)絡(luò)請(qǐng)求的話,可以用以下代碼,自動(dòng)幫你去掉這個(gè)討厭的空值
self.removesKeysWithNullValues = YES;
5、終極方案
終于找到了一勞永逸的方案,牛逼的老外寫(xiě)了一個(gè)Category,叫做NullSafe ,在運(yùn)行時(shí)操作,把這個(gè)討厭的空值置為nil,而nil是安全的,可以向nil對(duì)象發(fā)送任何message而不會(huì)奔潰。這個(gè)category使用起來(lái)非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,對(duì),就是這么簡(jiǎn)單。詳細(xì)的請(qǐng)去Github上查看;
- IOS中Json解析實(shí)例方法詳解(四種方法)
- iOS json解析出錯(cuò)的幾種情況總結(jié)
- iOS開(kāi)發(fā)使用JSON解析網(wǎng)絡(luò)數(shù)據(jù)
- 詳解iOS開(kāi)發(fā)中解析JSON中的boolean類(lèi)型的數(shù)據(jù)遇到的問(wèn)題
- IOS 簡(jiǎn)單的本地json格式文件解析的實(shí)例詳解
- IOS json 解析遇到錯(cuò)誤問(wèn)題解決辦法
- IOS開(kāi)發(fā)之JSON轉(zhuǎn)PLIST實(shí)例詳解
- iOS Swift讀取本地json文件報(bào)錯(cuò)的解決方法
- 談?wù)刬OS開(kāi)發(fā)之JSON格式數(shù)據(jù)的生成與解析
- iOS讀寫(xiě)json文件的方法示例
相關(guān)文章
iOS 隱私權(quán)限和通過(guò)openURL實(shí)現(xiàn)跳轉(zhuǎn)實(shí)例
這篇文章主要介紹了iOS 隱私權(quán)限和通過(guò)openURL實(shí)現(xiàn)跳轉(zhuǎn)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
iOS應(yīng)用開(kāi)發(fā)中視圖控件UIWindow的基本使用教程
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中視圖控件UIWindow的基本使用教程,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-02-02
iOS中定位(location manager )出現(xiàn)log日志的解決辦法
這篇文章主要給大家介紹了關(guān)于iOS中定位(location manager )出現(xiàn)log日志的解決辦法,文中通過(guò)示例代碼將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
深入解析iOS應(yīng)用開(kāi)發(fā)中九宮格視圖布局的相關(guān)計(jì)算方法
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中九宮格視圖布局的計(jì)算方法,包括item尺寸和坐標(biāo)等一系列影像布局的數(shù)值相關(guān)計(jì)算的講解,需要的朋友可以參考下2016-03-03
IOS開(kāi)發(fā)用戶(hù)登錄注冊(cè)模塊所遇到的問(wèn)題
最近和另外一位同事負(fù)責(zé)公司登錄和用戶(hù)中心模塊的開(kāi)發(fā)工作。通過(guò)本文給大家分享IOS開(kāi)發(fā)用戶(hù)登錄注冊(cè)模塊所遇到的問(wèn)題,感興趣的朋友一起學(xué)習(xí)吧2016-01-01
iOS模仿微信長(zhǎng)按識(shí)別二維碼的多種方式
這篇文章主要介紹了iOS模仿微信長(zhǎng)按識(shí)別二維碼的兩種方式,文章第二種方式是識(shí)別網(wǎng)頁(yè)中的二維碼,具體思路詳解大家參考下本文2017-07-07

