iOS 后台返回json解析出現的null的解決辦法


在后台返回值為Null為空時,我們代碼沒有判斷時,程序就會崩潰。當時一直很疑惑是為啥,后來發現是數據問題,由於服務器的數據庫中有些字段為空,然后以Json形式返回給客戶端時就會出現這樣的數據。當我們通過一些第三方數據解析庫解析數據后,就會是下圖這種數據格式。null既不是字符串也不是nil所以我們有些判斷是沒用的。
null

解析成對象之后,如果直接向這個對象發送消息(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而不會奔潰。
具體使用方法項目有說明

NullSafe鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM