2014-09-01 145 views
0

我需要檢查一個密鑰是否存在於一個id中。iOS檢查密鑰存在

我有這樣的:

id tab = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError]; 

我需要檢查,如果該鍵 「名」 的存在,但沒有任何工程..

我想:

if([tab objectForKey:@"name"]) 

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull null]]) 

等。但我總是錯誤:[__NSCFArray objectForKey:]:無法識別的選擇發送到實例

我必須做什麼檢查密鑰是否存在之前獲取值?

+0

檢查valueForKey。 – Jitendra 2014-09-01 13:07:26

+0

確實... omg ... Thx – deveLost 2014-09-01 13:18:12

+0

可能發生,因爲'NSArray'沒有像'-objectForKey:'這樣的方法,該方法是例如的特權。 'NSDictionary'類;請參閱此處的'NSArray'類引用:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html – holex 2014-09-01 13:36:05

回答

2

您需要將tab轉換成NSDictionary

NSDictionary *tab = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError]; 

NSArray *tab   = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError]; 
NSDictionary *dicTab = [tab objectAtIndex:indexPath.row]; 

然後檢查是否存在的關鍵。

if([tab objectForKey:@"name"]){ 
    // Yes exists 
} 

注:可能是你需要它鑄造NSDictionary之前扔在NSArray。它完全取決於你的JSON響應。

+0

您錯過了星號;)NSDictionary * tab =。 ..; – Matz 2014-09-01 14:09:47

+0

這不會有幫助,因爲OP有一個數組,而不是字典。 – gnasher729 2014-09-01 14:25:56

+0

@Matz謝謝,我更新了我的答案。 – iEngineer 2014-09-01 14:27:34

3

根據您所收到的數據,NSJSONSerialization會給你的三種可能的事情之一:

零 - 如果在分析過程中的任何錯誤,結果是零。 NSDictionary * - 如果數據是JSON對象,則結果將是NSDictionary *。 NSArray * - 如果數據是JSON數組,則結果將是NSArray *。所以你寫:

id tab = [NSJSONSerialization ... ]; 
if (tab == nil) 
{ 
    NSLog (@"There was an array, tab is nil"); 
} 
else if ([tab isKindOfClass:[NSDictionary class]]) 
{ 
    NSDictionary* tabDict = tab; 
    // ... Do stuff with tabDict. Don't touch tab anymore. 
} 
else if ([tab isKindOfClass:[NSArray class]]) 
{ 
    NSArray* tabArray = tab; 
    // ... Do stuff with tabArray. Don't touch tab anymore. 
} 
else 
{ 
    NSLog (@"JSON parser went crazy. Report a bug to Apple"); 
} 

你需要弄清楚根據文件,你有什麼樣的JSON文件服務器應該給你。但是一旦你知道這一點,只是因爲你知道服務器是假設發送給你一個JSON對象,例如,這並不意味着確實爲發送了一個JSON對象。所以你需要小心並檢查你收到的數據,以避免你的應用崩潰,如果意外發生。

1

只是陳述關於這行代碼:

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull null]]) 

這是不對的。如果你想檢查是否有類對象是NSNull類,你會檢查

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull class]]) // class not null 

但是,它更簡單,更快速通過檢查

if([tab objectForKey:@"name"] == [NSNull null]) 
來檢查對象是否是NSNull對象

這是可行的,因爲[NSNull null]是一個單例對象。將只有NSNull類的一個對象,而且[NSNull null]將返回該對象。所有NSNull對象都是對象相同的對象。

如果您的JSON數據包含空值,您將收到一個NSNull對象。有些服務器永遠不會生成空值,一旦發生這種情況,初學者的代碼會崩潰 - 因此檢查空值是個好主意。

NSNull值和nil值之間的區別是,在第一種情況下,服務器實際上包含一個條目「name」:null,而在第二種情況下,只有沒有鍵入「name」在所有。