2015-01-21 32 views
0

我從一個web服務器讀取json而得到一個字典數組,並使用以下命令來確保我在第一個字典中獲得了一個特定的鍵獲取其int值之前,數組中:在調用intvalue之前對字典對象進行空檢查仍導致對空對象的intvalue調用

   if([jsonObject[0] objectForKey:@"votes"]!= nil) 
      { 
      int votes = [[jsonObject[0] objectForKey:@"votes"] intValue]; 
      [[UserObject userUnique] updateVotes:votes]; 
      }     

然而,我的應用程序仍偶爾崩潰說我已呼籲對的intValue空。我也嘗試構建控制語句爲

if([jsonObject[0] objectForKey:@"votes"]) 

但這也導致相同的錯誤/應用程序崩潰。我的語法似乎與SO上的接受答案一致(Check if key exists in NSDictionary is null or not)。任何其他建議/我應該如何檢查應用intvalue的鍵值對的存在?

謝謝你的任何建議。

+0

什麼類型的對象在字典中存儲爲「票」? NSNumber的? – Fonix 2015-01-21 10:26:46

+0

@Fonix這是一個NSString – 2015-01-21 10:31:03

+0

請發佈完整的錯誤信息。它提到「NSNull」嗎? – 2015-01-21 10:32:15

回答

0

nilnull之間的差異。 nil不是一個對象:它是一個特殊的指針值。 null(調回[NSNull null])是一個對象:它是必需的,因爲它可以存儲在容器中,如NSDictionary

NSString *votesString = [jsonObject[0] objectForKey:@"votes"]; 
if (votesString != nil && votesString != [NSNull null]) 
{ 
    int votes = [votesString intValue]; 
    [[UserObject userUnique] updateVotes:votes]; 
} 

編輯:到@SunnysideProductions的回答質疑

你提到的後建議通過創建一個-safeObjectForKey:方法轉向null值轉換爲nil值的方式。您沒有使用-safeObjectForKey:,您正在使用默認的-objectForKey:方法。

+0

這是有道理的。我會試試這個,但它與我提到的SO發佈相矛盾。 – 2015-01-21 10:37:38

+0

@SunnysideProductions否,它不。當字典對傳遞的鍵有** no **值時''nForce'由'objectForKey:'返回。 '[NSNull null]'是一個可以存儲在'NSDictionary'中的對象,例如表示一個空值。特別是在JSON中,獲取'nil'將意味着JSON對象沒有這樣的鍵,但獲得'NSNull'將意味着JSON對象具有與null值關聯的鍵(例如'{「myKey 「:null}')。 [看到這個問題](https://stackoverflow.com/questions/5716942/touchjson-dealing-with-nsnull) – 2015-01-21 10:45:39

+0

這似乎已經做到了。再次感謝! – 2015-01-21 19:47:04

0

在您的代碼中連續。不要使用方法運行。特別是在使用json時,最好添加更多的null和type-checks。讓我們這樣做:

if (jsonObject && [jsonObject isKindOfClass:[NSArray class]]) 
{ 
    NSArray *jsonArray=(NSArray *)jsonObject; 
    if (jsonArray.count>0) 
    { 
    id firstObject=jsonArray[0]; 
    if ([firstObject isKindOfClass:[NSDictionary class]]) 
    { 
     NSDictionary *jsonDict=(NSDictionary *)firstObject; 
     id votesNumber=jsonDict[@"votes"]; 
     if (votesNumber && [votesNumber isKindOfClass:[NSNumber class]]) 
     { 
     int votes=[votesNumber intValue]; 
     [[UserObject userUnique] updateVotes:votes]; 
     } 
    } 
    } 
} 

現在代碼更安全。它仍然崩潰?

+0

我會嘗試一下,並在幾個小時內通知您。有時會讓它崩潰需要一段時間。 – 2015-01-21 10:39:43

+0

p.s.當你說「不用方法運行」時,這是否意味着不確認對象的類就不調用對象的方法?或者你的意思是別的嗎? – 2015-01-21 10:42:18