2012-04-28 124 views
10

我正在使用Weather Underground API製作應用程序,並且在解析與嚴重警報相關的塊時遇到了一些障礙。 JSON使用具有子鍵值對的鍵值對 - 這對我來說不成問題,因爲我可以將後續NSDictionaries放在其中 - 但嚴重警報的條目已證明存在問題。請看下圖:將JSON數組解析爲NSDictionary

"alerts": [ 
    { 
    "type": "WAT", 
    "description": "Flash Flood Watch", 
    "date": "3:13 PM EDT on April 28, 2012", 
    "date_epoch": "1335640380", 
    "expires": "8:00 AM EDT on April 29, 2012", 
    "expires_epoch": "1335700800", 
    "message": "\u000A...Flash Flood Watch in effect through Sunday morning...\u000A\u000AThe National Weather Service in Charleston has issued a\u000A\u000A* Flash Flood Watch for portions of northeast Kentucky... (Note: I trimmed this for length's sake), 
    "phenomena": "FF", 
    "significance": "A" 
    } 
] 

「警報」對別人我已經能夠解析,因爲它有這個[]支架周圍的子值不同,我不知道如何清除它,我可以訪問子值。在我已經能夠解析的其他示例中,它只有{}括號,而不是{}和[]括號。作爲參考,括號始終存在 - 即使沒有惡劣天氣警報......在這種情況下,「警報」對將返回沒有子對的括號[]。

有沒有一種方法可以從NSDictionary中刪除[]括號,否則忽略它們?任何意見,將不勝感激!


參考,故障排除幫助,這裏是我是如何解析成功的JSON文件的其餘部分:

1)從原始JSON

//Process Weather Call 
NSError* error; 
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

2)創建創建一個NSDictionary隨後的字典嵌套json對

NSDictionary *current_observation = [json objectForKey:@"current_observation"]; 

3)分配值

NSString* weather; 
weather = [current_observation objectForKey:@"weather"]; 

因此,最終結果將是一個字符串,表示「部分多雲」或其他,以及我沒有顯示的許多相關天氣值。這些解析成功,因爲它們只有範圍括號{},而不是[]括號。

回答

19

括號表示Json數據存在於數組中。如下

NSArray *alertArray = [json objectForKey:@"alerts"]; 

現在你應該通過所有警報環路和分析他們,你可以分析它(在你的情況下,它僅1中,但它可以在其他的JSON字符串會更多):

//parse each alert 
for (NSDictionary *alert in alertArray){ 
    NSString* description = [alert objectForKey:@"description"]; 
    //etc... 
} 
+0

當然,一個數組!那些括號應該已經把它刪除了...我想我今天工作太久了。 :p 無論如何,在警報環境中也是有意義的 - 在給定時間可能有多個警報,因此應該有一些方法來處理API中的警報。 我會試一試 - 感謝您的幫助! – 2012-04-28 23:27:11

5

好,我得到了它的工作 - 我想在這裏提供一個例子,因爲我最終不得不建立在@Lefteris給予的建議以使其工作。

我最終不得不首先將json數組作爲NSArray傳遞,然後使用數組的第一個元素將它轉換爲NSDictionary。之後的所有內容都是作爲@Lefteris描述的。

那麼,到底,這裏是我得到了什麼:

NSArray *alerts = [json objectForKey:@"alerts"]; 
NSDictionary *alertDict = [[NSDictionary alloc] init]; 

//Check that no alerts exist to prevent crashing 
if([alerts count] < 1) { 
    NSLog(@"No Alerts Here!"); 
    type = nil; 
    ... 
} 
else //Populate fields 
{ 
    alertDict = [alerts objectAtIndex:0]; 
    for (NSDictionary *alert in alertDict) 
    { 
     NSLog(@"Printing alert!"); 
     type = [alertDict objectForKey:@"type"]; 
     ... 
    } 
} 

這讓我起來,並與運行單個陣列迭代 - 怎麼回事我希望我可以通過陣列只會迭代因爲我知道計數並處理任何其他警報。再次感謝您的幫助!

+0

此代碼現在仍在工作,我試着用你自己的例子 – Khay 2014-06-17 11:35:46

+0

@Khay對不起?當時適合我工作。對我來說,似乎有人懷疑沒有人指出10k的觀點和2年過去的問題。您是否使用了相同版本的iOS和相同(或可比較的)數據?另外,查看Lefteris的答案的編輯歷史記錄 - 去年那裏的代碼改變了,所以有些東西可能會隨着更新的版本而改變。我真的不能告訴你,因爲我不再與iOS一起工作。 – 2014-06-17 13:36:53