2013-11-09 46 views
2

這是我的代碼至今解析JSON字符串和數組與NSJSONSerialization的問題?

// Parse data using NSJSONSerialization 
NSError *error = nil; 
NSArray *JsonArray = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error: &error]; 
if(!JsonArray) 
{ 
    NSLog(@"Error Parsing Data: %@", error); 
} 
else 
{ 
    for(NSDictionary *event in JsonArray) 
    { 
     if([[event description] isEqualToString:@"error"]) 
     { 
      // Get error number? I am confused by this part 
      NSLog(@"Element: %@", [event objectForKey:@"error"]); 
     } 
     else 
     { 
      NSLog(@"Element: %@", [event description]); 
     } 
    } 
} 

這是JSON數據解析正確:

[{data string}, {data strings}] 

這只是給我的字符串「錯誤」,而不是INT以及:

{"error":0} 

我從PHP腳本回應這些數據,如果有幫助的話。我只是做錯了,還是我錯過了什麼?

+0

@ H2CO3抱歉,感謝您的編輯。 –

+0

除此之外:你想檢查是否有關鍵錯誤的對象(即if(event [@「error」]!= nil)')。 – 2013-11-09 19:13:18

+0

@ H2CO3我試着用[event objectForKey ...但是我得到了Sigabrt。 –

回答

4

你的問題是,當你收到一個錯誤,你回來了NSDictionary,而不是一個NSArray。這應該工作:

if ([jsonObject isKindOfClass:[NSArray class]]) { 
    // no error: enumerate objects as you described above 
} else if ([jsonObject isKindOfClass:[NSDictionary class]]) { 
    // error: obtain error code 
    NSNumber *errCode = jsonObject[@"error"]; 
} else { 
    // something bad's happening 
} 

文體建議件:

  1. 不要叫你的對象JsonArray,因爲它並不總是一個數組。叫它jsonObject

  2. 不要用大寫字母開始變量名稱。如果你已經張貼你試圖解析完整的JSON文件,因爲不這樣做,是絕對沒有機會弄清楚你的代碼是否正確附近的任何地方

+0

在你的回答中,你能解釋爲什麼不使用大寫字母嗎?這真的有幫助,讓我試試。 –

+0

@EliteGamer因爲這是一個慣例。 – 2013-11-09 19:29:47

+0

你能解釋一下你的意思嗎? –

0
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:&error]; 
NSLog(@"jsonDic: %@", [jsonDic objectForKey:@"string"]); 
+0

你可以嘗試以上 – Parthi

+0

這將失敗的任何錯誤的輸入。 – 2013-11-09 19:20:19

+0

@Parthi,他是對的。我一直都不會有錯誤。 –

0

將是巨大的。你給出的例子[{data string},{data strings}]絕對不是正確的JSON文檔,所以試圖解析它將返回nil。 {「error」:0}是一個帶有單個鍵「錯誤」和值爲0的字典。使用單個鍵的字典可以說是不尋常的。

JSON文檔包含一個數組或對象(使用JSON術語),它將被轉換爲NSArray *或NSDictionary *。你應該知道你是否期望數組或字典。如果你期望一個NSArray,檢查[jsonObject isKindOfClass:[NSArray class]]。如果你期望一個NSDictionary,檢查[jsonObject isKindOfClass:[NSDictionary class]]。如果你不這樣做,那麼錯誤的JSON文檔將會崩潰你的應用程序或產生總的廢話。

如果你有一個數組,那麼你通常會迭代數組的元素並依次處理每個元素。如果你有一本字典,你通常會查找你知道如何處理的密鑰。你在做什麼,遍歷一個字典數組,並檢查一個帶有「錯誤」鍵的字典,這是一個非常奇怪的JSON文檔設計。

並查找「描述」方法的作用。 「描述」是NSLog在打印對象時要求打印什麼內容。對於只有一個鍵「錯誤」且值爲0的NSDictionary,它會返回類似「error:0」的東西,這當然與「error」不一樣。