在后台返回值為Null為空時,我們代碼沒有判斷時,程序就會崩潰。當時一直很疑惑是為啥,后來發現是數據問題,由於服務器的數據庫中有些字段為空,然后以Json形式返回給客戶端時就會出現這樣的數據。當我們通過一些第三方數據解析庫解析數據后,就會是下圖這種數據格式。null既不是字符串也不是nil所以我們有些判斷是沒用的。
解析成對象之后,如果直接向這個對象發送消息(length,count 等等)就會直接崩潰。提示錯誤為
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
解決辦法
1.對取值對象類型判斷。缺點是太過繁瑣,每次都要寫。
#define kDictIsEmpty(dic) ([dic isKindOfClass:[NSNull class]])//宏
if (![@"你要取的值" isKindOfClass:[NSNull class]]){
//數據
}
2.字符串匹配。在獲取到服務器返回的Json時(返回結果是string對象)通過stringByReplacingOccurrencesOfString方法,替換"null"為"空字符",然后解析。不過通過這個方法也有可能導致數據無法解析
json = [jsonStr stringByReplacingOccurrencesOfString:@":null" withString:@""];
3.解析時把null 類型替換成nil。
//有返回值的宏
#define isToNull(value) \
({\
id tmp;\
if (![value isKindOfClass:[NSNull class]])\
tmp = value;\
else
tmp = nil;\
(tmp);\
})\
//調用方法
label.text = isToNull(dic[@"data"]);
4.如果使用是AFNetwork做網絡請求的話,可以用以下代碼,會自動去除空值
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.removesKeysWithNullValues = YES;//去除空值
manager.responseSerializer = response;//申明返回的結果是json類
去除前
去除后 所有為空的鍵值對都不會自動去除
5.最有效而且簡單的方法。使用國外一位大牛寫的Category,叫做NullSafe ,在運行時操作,把空值置為nil,而nil是安全的,可以向nil對象發送任何message而不會奔潰。
具體使用方法項目有說明