Json中null的處理方法

問題描述
在服務(wù)器返回 json 數(shù)據(jù)的時候逐抑,時常會出現(xiàn)如下數(shù)據(jù)

"somevalue":null

通過JsonKit 這個第三方庫解析出來的數(shù)據(jù)就成了
somevalue = "<null>";
這個數(shù)據(jù)類型不是nil 也不是 String第焰,而是NSNull 的對象咽袜。 如果直接向這個對象發(fā)送消息就會直接崩潰。提示錯誤為:

-[NSNulllength]: unrecognized selector sent to instance 0x388a4a70

解決方法
1驮吱、最開始的解決方法就是為了應(yīng)付當(dāng)前遇到的崩潰茧妒,看看哪個字段可能為空,那么就對該字段使用前進行判斷左冬,通過崩潰時的錯誤提示可以看出桐筏,這樣的字段解析成的對象是 NSNull 類型的,所以可以直接判斷是不是此類型:

if(![isKindOfClass:[NSNullclass]]){xxxxxxx;}

但是無法對每個字段逐一進行該操作拇砰,所以這種辦法僅適用于判斷特定字段梅忌。
2、用字符串匹配null并進行替換除破。在獲取到服務(wù)器返回的Json時牧氮,返回結(jié)果時string對象,于是就先替換 null 為 為空字符””瑰枫,然后再解析踱葛。

json = [jsonStr
stringByReplacingOccurrencesOfString:@":null"withString:@":"""];

這個方法可以寫成NSString的category,然后調(diào)用相應(yīng)方法即可光坝,相對簡潔尸诽,但是如果要對string,array盯另,dictionary都進行判斷性含,也是不小的工作量。而且服務(wù)器的數(shù)據(jù)格式也不能保證鸳惯,也許會匹配不上商蕴。
3、最后沒有辦法芝发,只能在解析的時候下手绪商,把是NSNull 類型的值替換成nil。 一般就寫個tool方法辅鲸,然后解析時調(diào)用格郁。但是嫌太麻煩,就想弄寫個宏,通過搜索驚奇的發(fā)現(xiàn)宏也是可以有返回值的理张,結(jié)果如下:

#define VerifyValue(value)
({idtmp;
      if([value isKindOfClass:[NSNullclass]])
            tmp =nil;
      else
            tmp = value;
      tmp;
})

宏里的最后一句語句便是返回值。然后在解析數(shù)據(jù)時調(diào)用宏:

contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);

這個方法其實和方法三是類似的思想绵患。
4雾叭、如果你使用AFNetwork 這個庫做網(wǎng)絡(luò)請求,可以用以下代碼去掉這個討厭的空值

((AFJSONResponseSerializer*)manager.responseSerializer).removesKeysWithNullValues=YES;

經(jīng)過如上設(shè)置落蝙,所有 NSNull 的值织狐,都變成了 nil。
5筏勒、NullSafe
githhub上有一個Category移迫,叫做NullSafe ,可以在運行時操作管行,把空值置為nil厨埋,而nil是安全的,可以向nil對象發(fā)送任何message而不會奔潰捐顷。這個category使用起來非常方便荡陷,只要把NullSafe.m加入到工程中就可以了,無需做其他操作迅涮,NullSafe會在運行時自動加載废赞。詳細(xì)的請去Github上查看:NullSafe
這里還有一個極簡的封裝方法:

#import"NSNull+OVNatural.h"
@implementationNSNull(OVNatural)
- (void)forwardInvocation:(NSInvocation *)invocation
{
if([selfrespondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:self];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature *sig = [[NSNull class] instanceMethodSignatureForSelector:selector];
if(sig ==nil) {
sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
}
returnsig;
}
@end

關(guān)于[NSMethodSignature signatureWithObjCTypes:“@^vc”]的功能
可以參考以下兩篇文章
Objective-C Runtime Programming Guide
Type Encodings

文中方法源自在網(wǎng)上看到的多種方法的整理,加入了一定自己的理解叮姑。如果有原創(chuàng)者看到麻煩告訴我唉地,我會加上原博地址或者刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末传透,一起剝皮案震驚了整個濱河市耘沼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旷祸,老刑警劉巖耕拷,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異托享,居然都是意外死亡骚烧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門闰围,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赃绊,“玉大人,你說我怎么就攤上這事羡榴”滩椋” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忠售。 經(jīng)常有香客問我传惠,道長,這世上最難降的妖魔是什么稻扬? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任卦方,我火速辦了婚禮,結(jié)果婚禮上泰佳,老公的妹妹穿的比我還像新娘盼砍。我一直安慰自己,他們只是感情好逝她,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布殉簸。 她就那樣靜靜地躺著集惋,像睡著了一般奶赠。 火紅的嫁衣襯著肌膚如雪雳殊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天臀晃,我揣著相機與錄音跌宛,去河邊找鬼。 笑死积仗,一個胖子當(dāng)著我的面吹牛疆拘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寂曹,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼哎迄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隆圆?” 一聲冷哼從身側(cè)響起漱挚,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渺氧,沒想到半個月后旨涝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侣背,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年白华,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贩耐。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡弧腥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出潮太,到底是詐尸還是另有隱情管搪,我是刑警寧澤虾攻,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站更鲁,受9級特大地震影響霎箍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澡为,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一朋沮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缀壤,春花似錦、人聲如沸纠亚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒂胞。三九已至图呢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骗随,已是汗流浹背蛤织。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸿染,地道東北人指蚜。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像涨椒,于是被迫代替她去往敵國和親摊鸡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 在iOS開發(fā)過程中經(jīng)常需要與服務(wù)器進行數(shù)據(jù)通訊蚕冬,Json就是一種常用的高效簡潔的數(shù)據(jù)格式免猾。問題現(xiàn)象但是幾個項目下來...
    seventhboy閱讀 605評論 0 1
  • 在iOS開發(fā)過程中經(jīng)常需要與服務(wù)器進行數(shù)據(jù)通訊,Json就是一種常用的高效簡潔的數(shù)據(jù)格式囤热。問題現(xiàn)象但是幾個項目下來...
    莫許閱讀 609評論 0 0
  • 在iOS開發(fā)過程中經(jīng)常需要與服務(wù)器進行數(shù)據(jù)通訊猎提,Json就是一種常用的高效簡潔的數(shù)據(jù)格式。 問題現(xiàn)象 但是幾個項目...
    XLsn0w閱讀 3,103評論 5 2
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用旁蔼,...
    LZM輪回閱讀 3,291評論 0 6
  • 富爸爸關(guān)心財務(wù)自由锨苏,窮爸爸關(guān)心工作安全。所在在作者上完大學(xué)獲得學(xué)士學(xué)位后給出了不同的建議棺聊。富爸爸建議的生活道路位于...
    Betty_曉芳閱讀 579評論 0 4