2012-05-22 22 views
22

我們在我們的移動應用程序中使用了AFNetworking,並且很多時候我們會返回JSON,對於某些值而言它爲空。我可以讓AFNetworking自動將NULL解析爲零嗎?

我厭倦了做下列事情。

if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) { 
    nickname = nil; 
} else { 
    nickname = [json objectForKey:@"nickname"]; 
} 

什麼我們可以做,使AFNetworking爲零自動將組對象或數字爲0;如果該值在JSON響應空?

回答

20

這是不可能的,因爲詞典不能包含nil作爲鍵的對象。爲了獲得你想要的行爲,關鍵就必須完全排除在外,這是不合乎要求的。

假設您無法控制您收到的數據,也不知道JSON中存在哪些鍵。如果您想將它們全部列出,或者將它們顯示在表格中,並且空字符的鍵不在字典中,您將看到不正確的列表。

NSNull是Cocoa集合的「無」佔位符,這就是爲什麼它在這種情況下使用。

你可以讓你的輸入更容易一點了宏:

#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_] 

nickname = nilOrJSONObjectForKey(json, @"nickname"); 
+0

我認爲這可能是我要說的,我的意思是宏。謝謝! – birarda

+0

其實我不確定爲什麼把鑰匙完全丟掉是一件壞事?我寧願做'nickname = [json objectForKey:@「nickname」]',並且它是空的,並且能夠在別處說出'if(!nickname)'。 – birarda

+0

@birarda:如果你想向字典索取所有密鑰的列表,該怎麼辦?你會得到一個不正確的答案 - 關鍵字存在於JSON中。 –

1

如果用SBJSON替換默認的NSJSONSerialization,它將解決您的問題。

SBJSON使對象無NSJSONSerialization的選擇「空」

看看你可以使用不同的JSON解析器的要求,而不是。 https://github.com/AFNetworking/AFNetworking#requirements

+0

我只是想這一點,似乎並沒有被SBJSON的默認行爲。如果我刪除控制語句來檢查是否爲null,那麼當嘗試設置屬性時,會出現此錯誤'[NSNull stringByDecodingHTMLEntities]'。 – birarda

29

您可以AFHTTPSessionManager響應串行設置標誌setRemovesKeysWithNullValues爲YES:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config]; 
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; 
[serializer setRemovesKeysWithNullValues:YES]; 
[manager setResponseSerializer:serializer]; 
+0

我比其他人更喜歡你的答案 – Lolloz89

2

DV_的答案AFHTTPSessionManager的偉大工程。但是,如果你正在使用AFHTTPRequestOperation而不是管理員的,試試這個:

AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; 
serializer.removesKeysWithNullValues = YES; 
op.responseSerializer = serializer; 
+0

作品。不過,我認爲你的意思是: 'AFJSONResponseSerializer * serializer = [AFJSONResponseSerializer serializer];' –

+0

是的,的確如此。編輯。謝謝 – gavdotnet

2

有一個叫碎https://github.com/hyperoslo/Minced美麗cocoapod,可以做一些事情,可以幫助你處理來自JSON響應NULL。它不使用NULL,而是使用空字符串。

0

您可以在此功能下自定義AFNetworking。設置的任何值默認爲對象爲NULL

static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { 
if ([JSONObject isKindOfClass:[NSArray class]]) { 
    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; 
    for (id value in (NSArray *)JSONObject) { 
     [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; 
    } 

    return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray]; 
} else if ([JSONObject isKindOfClass:[NSDictionary class]]) { 
    NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject]; 
    for (id <NSCopying> key in [(NSDictionary *)JSONObject allKeys]) { 
     id value = (NSDictionary *)JSONObject[key]; 
     if (!value || [value isEqual:[NSNull null]]) { 
      // custom code here 
      //[mutableDictionary removeObjectForKey:key]; 
      [mutableDictionary setObject:@"" forKey:key]; 
     } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) { 
      mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions); 
     } 
    } 

    return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary]; 
} 

return JSONObject; 

}

相關問題