2012-06-03 38 views
6

我正在使用iphone應用程序的目標c。我看到[dictionary objectForKey:@"key"]返回<null>。做一個if([dictionary objectForKey:@"key"] == nil || [dictionary objectForKey:@"key"] == null)似乎沒有捕捉到這種情況。if語句的字典objectforkey:@「key」值爲<null>

做一個if([[dictionary objectForKey:@"key"] isEqualToString:@"<null>"])會導致我的程序崩潰。

什麼是正確的表達趕上<null>

更多詳細信息 的如果爲零聲明仍無法追趕的情況下......也許我只是太累了,看到的東西,但這裏的附加信息:

字典是通過URL填充包含像這樣JSON數據:

NSURL *url = [NSURL URLWithString:"http://site.com/"]; 

dataresult = [NSData dataWithContentsOfURL:url]; 

NSError *error; 
NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:dataresult options:kNilOptions error:& error]; 

詞典中做一個的NSLog給出了這樣的輸出:

{ 
    key = "<null>"; 
    responseMessage = "The email/registration code combination is incorrect"; 
} 
+0

對不起,我把它改成字典......我現在非常非常累 – John

+0

嗯......現在我正在更仔細地看待你的問題,你*是*正在尋找零在你的「如果」情況下。如果你在你的代碼中做了''id something = [dictionary objectForKey:@「key」];'「並且在那裏設置了一個調試斷點,是* something * something還是nil? –

+0

東西的輸出是''。 json feed是由php網站生成的。這有什麼區別嗎? – John

回答

12

您有一個NSNull的實例。實際上,實例,因爲它是一個單例。

可可收藏不能包含nil,但如果您嘗試訪問不存在的東西,它們可能會返回nil

但是,有時對於程序來說,在一個集合中存儲一個意思是「無」的東西是有價值的。這就是NSNull的用途。

恰巧,JSON可以表示空對象。因此,在將JSON轉換爲Cocoa集合時,這些空對象會被轉換爲NSNull對象。

當Cocoa使用「%@」說明符格式化字符串時,nil值將被格式化爲括號爲「(null)」。一個NSNull值將被格式化爲帶有尖括號的「< null>」。

+4

WOOO HOOOOO !!!!!!這是NSNull! if([fullDataArray objectForKey:@「key」] == nil || [fullDataArray objectForKey:@「key」] == NULL || [[fullDataArray objectForKey:@「key」] isKindOfClass: [NSNull class]]){/ *看,我在!現在睡覺時間* /}' – John

+1

'nil'和'NULL'是等價的,所以你不需要檢查兩者是否相等。你可以說'if([fullDataArray objectForKey:@「key」] || ...'。 – echristopherson

+0

@echristopherson,你的意思是如果(![fullDataArray objectForKey:@「key」] || ...'with一個NOT運算符(「!」),用於匹配約翰的條件,他將檢查相等性爲'nil' /'NULL'。 –

3

新的回答:

感謝您添加的細節。它看起來像你設置的「dataresult」是而不是一個JSON對象,所以你不會奇怪你將一個原始字符串放入「[NSJSONSerialization JSONObjectWithData:]」,你可能需要對你的數據做一些基本的錯誤檢查你叫什麼JSON相關

原來的答覆:

首先,如果這是我的代碼,我不會命名「NSDictionary」對象「array」(我看你抓住我的評論在您的編輯...希望你能儘快睡上一覺!)。

Se condly,你要找的是「nil」,而不是名爲「<null>」的字符串。如Apple's documentation for objectForKey: states,如果找不到您要求的密鑰的對象,則返回零。 Xcode控制檯會嘗試將nil對象轉換爲輸出中的「<null>」字符串。

做「if [dictionary objectForKey: @"key"] != nil」,你應該更開心。

+0

但PHP腳本做了一個json_encode($ array)來輸出內容。形成我的目標C代碼,我從訪問字典中的任何其他鍵值對都沒有問題。你確定這不是一個JSON對象嗎? – John

+0

只是爲了搞笑,把'NSData'對象轉換成一個'NSString'(或簡單地通過'[NSString stringWithContentsOfURL:]'')和'NSLog'來檢索URL中的數據,看看它是否看起來像JSON。 –

2

只需使用下面的代碼:

if ([[dictionary valueForKey:@"key"] isKindOfClass:[NSNull Class]]{ 
    //This means that the value inside the dictionary is <null> 
} 
else{ 
//the value is not <null> 
} 

這應該這樣做。