iOS中json數(shù)據(jù)存在NULL的問(wèn)題

問(wèn)題現(xiàn)象

本人最近發(fā)現(xiàn)寫的幾個(gè)項(xiàng)目都會(huì)遇到一個(gè)嚴(yán)重的坑,程序在獲取某些數(shù)據(jù)之后莫名崩潰(其實(shí)很早就發(fā)現(xiàn)了,只是不想去解決)。原因:由于服務(wù)器返回?cái)?shù)據(jù)的字段偶爾有NULL類型存在,然后以Json形式返回給客戶端時(shí)就會(huì)出現(xiàn)這樣的數(shù)據(jù),如果直接賦值給其他對(duì)象就會(huì)造成崩潰。

解決方法

一、如果你使用AFNetwork 這個(gè)庫(kù)做網(wǎng)絡(luò)請(qǐng)求的話,可以用以下代碼,自動(dòng)幫你去掉這個(gè)討厭的空值

AFNetWorking移除空值

二、創(chuàng)建一個(gè)字典的分類

.h文件

#import <Foundation/Foundation.h>

@interfaceNSDictionary (SetNullStr)

+(id)changeType:(id)myObj;

@end

.m文件

#import"NSDictionary+SetNullStr.h"

@implementationNSDictionary (SetNullStr)

//將NSDictionary中的Null類型的項(xiàng)目轉(zhuǎn)化成@""

+(NSDictionary*)nullDic:(NSDictionary*)myDic

{

NSArray*keyArr = [myDicallKeys];

NSMutableDictionary*resDic = [[NSMutableDictionaryalloc]init];

for(inti =0; i < keyArr.count; i ++)

{

idobj = [myDicobjectForKey:keyArr[i]];

obj = [selfchangeType:obj];

[resDicsetObject:objforKey:keyArr[i]];

}

returnresDic;

}

//將NSArray中的Null類型的項(xiàng)目轉(zhuǎn)化成@""

+(NSArray*)nullArr:(NSArray*)myArr

{

NSMutableArray*resArr = [[NSMutableArrayalloc]init];

for(inti =0; i < myArr.count; i ++)

{

idobj = myArr[i];

obj = [selfchangeType:obj];

[resArraddObject:obj];

}

returnresArr;

}

//將NSString類型的原路返回

+(NSString*)stringToString:(NSString*)string

{

returnstring;

}

//將Null類型的項(xiàng)目轉(zhuǎn)化成@""

+(NSString*)nullToString

{

return@"";

}

//主要方法

//類型識(shí)別:將所有的NSNull類型轉(zhuǎn)化成@""

+(id)changeType:(id)myObj

{

if([myObjisKindOfClass:[NSDictionaryclass]])

{

return[selfnullDic:myObj];

}

else if([myObjisKindOfClass:[NSArrayclass]])

{

return[selfnullArr:myObj];

}

else if([myObjisKindOfClass:[NSStringclass]])

{

return[selfstringToString:myObj];

}

else if([myObjisKindOfClass:[NSNullclass]])

{

return[selfnullToString];

}

else

{

returnmyObj;

}

}

@end

需要轉(zhuǎn)換的時(shí)候調(diào)用以下方法就OK了,不管有多少個(gè)層級(jí),全部轉(zhuǎn)換

//json表示獲取到的帶有NULL對(duì)象的json數(shù)據(jù)

NSDictionary*newDict = [NSDictionary changeType:json];

三、終極方案

在網(wǎng)上查詢各種方案,最后在GitHub找到一個(gè)三方Category,叫做NullSafe ,在運(yùn)行時(shí)操作,把這個(gè)討厭的空值置為nil,而nil是安全的,可以向nil對(duì)象發(fā)送任何message而不會(huì)奔潰。這個(gè)category使用起來(lái)非常方便,只要加入到了工程中就可以了,你其他的什么都不用做。詳細(xì)的請(qǐng)去Github上查看:https://github.com/nicklockwood/NullSafe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 ? iOS源碼解析—YYModel(YYClassInfo)分析了如何根據(jù)OC的Class對(duì)象構(gòu)建...
    egoCogito_panf閱讀 11,835評(píng)論 4 32
  • 終于把前面的base文件夾簡(jiǎn)簡(jiǎn)單單的看了一遍,終于可以回到正片上來(lái)了,保證不爛尾。 項(xiàng)目天天用yymodel解析數(shù)...
    充滿活力的早晨閱讀 1,537評(píng)論 1 0
  • 后端返回的數(shù)據(jù)中總會(huì)出現(xiàn)一些NSNull類型,當(dāng)我們一處理程序就會(huì)崩潰,因此想到把返回的數(shù)據(jù)中的NSNull類型全...
    9o後侽孓閱讀 582評(píng)論 0 0
  • 接下來(lái)我們看base文件下的Foundation文件夾下文件 Base - Foundation 這個(gè)文件夾里面的...
    充滿活力的早晨閱讀 2,303評(píng)論 0 1
  • 早晨醒來(lái)的時(shí)候,我並不清醒,房間裏面很冷。我是被鬧鐘吵醒的,我定了大概二十個(gè)鬧鐘,從凌晨四點(diǎn)半到八點(diǎn),我是被七點(diǎn)的...
    閔文懷閱讀 770評(píng)論 1 4

友情鏈接更多精彩內(nèi)容