2013-10-29 194 views
0

我收到從我的服務器具有以下格式的JSON arrayios通過JSON循環?

{ messageArray: 
    [ { msgFrom: 'V351315826', 
     msgDate: Tue Oct 29 2013 04:00:35 GMT+0000 (UTC), 
     msgBody: 'Hi?', 
     channelID: 'V351315826' }, 
    { msgFrom: 'V351315826', 
     msgDate: Tue Oct 29 2013 04:00:38 GMT+0000 (UTC), 
     msgBody: 'Hello!', 
     channelID: 'V351315826' } ] } 

我怎麼可以遍歷呢?

到目前爲止什麼是得到的是:

NSError* error; 
NSDictionary *JSON = 
[NSJSONSerialization JSONObjectWithData: [(NSString *) message dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingMutableContainers 
            error: &error]; 
NSArray *messageArray = [JSON objectForKey:@"messageArray"]; 

// Parse and loop through the JSON 
for (NSDictionary * dataDict in messageArray) { 
    NSString * messageID = [dataDict objectForKey:@"id"]; 
    NSString * msgFrom = [dataDict objectForKey:@"msgFrom"]; 
    NSString * msgTime = [dataDict objectForKey:@"msgDate"]; 

    NSLog(@"FROM ---> %@", dataDict); 

} 
+1

什麼問題?你想做什麼? – BergQuester

+0

我想遍歷messageArray中的每個msgFrom,msgDate,channelID – Alosyius

+0

是否有問題?你所擁有的代碼看起來是一個好的開始。 – BergQuester

回答

4

當使用需要一個錯誤指示的方法,這是一個很好的做法是將您的NSErrornil非ARC代碼(ARC冗餘),並檢查爲nil和返回值檢查返回NSError

NSError* error = nil; 
NSDictionary *JSON = 
[NSJSONSerialization JSONObjectWithData: [(NSString *) message dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingMutableContainers 
            error: &error]; 

if (!JSON) 
{ 
    NSLog(@"%@", [error localizedDescription]); 
} 
else 
{ 
    NSArray *messageArray = [JSON objectForKey:@"messageArray"]; 

    // Parse and loop through the JSON 
    for (NSDictionary * dataDict in messageArray) { 
     NSString * messageID = [dataDict objectForKey:@"id"]; 
     NSString * msgFrom = [dataDict objectForKey:@"msgFrom"]; 
     NSString * msgTime = [dataDict objectForKey:@"msgDate"]; 

     NSLog(@"FROM ---> %@", dataDict); 
    } 
} 

與提供的JSON打印運行這個這個控制檯:

2013-10-28 22:28:20.552 SO question[12141:907] The operation couldn’t be completed. (Cocoa error 3840.) 

看來NSJSONSerialization解析這個很難。我自己並不太熟悉JSON。讓我們看看當我們通過JSON validator運行JSON時發生了什麼(將JSON粘貼到http://jsonlint.com中的許多驗證器之一)。這樣做會產生幾個語法錯誤。似乎密鑰必須用雙引號引起來,字符串也必須用雙引號引起來。我會假設這兩個字典中的所有值都是字符串。清理語法後,JSON的樣子:

{ 
    "messageArray": [ 
     { 
      "msgFrom": "V351315826", 
      "msgDate": "TueOct29201304: 00: 35GMT+0000(UTC)", 
      "msgBody": "Hi?", 
      "channelID": "V351315826" 
     }, 
     { 
      "msgFrom": "V351315826", 
      "msgDate": "TueOct29201304: 00: 38GMT+0000(UTC)", 
      "msgBody": "Hello!", 
      "channelID": "V351315826" 
     } 
    ] 
} 

打印出下面當我運行它通過您的代碼:

2013-10-28 22:36:02.018 SO question[12188:907] FROM ---> { 
    channelID = V351315826; 
    msgBody = "Hi?"; 
    msgDate = "TueOct29201304: 00: 35GMT+0000(UTC)"; 
    msgFrom = V351315826; 
} 
2013-10-28 22:36:02.018 SO question[12188:907] FROM ---> { 
    channelID = V351315826; 
    msgBody = "Hello!"; 
    msgDate = "TueOct29201304: 00: 38GMT+0000(UTC)"; 
    msgFrom = V351315826; 
} 

希望幫助!

+0

在檢查'JSON'而不是'error'方面做得很好。你實際上並不需要初始化'err',儘管這不是一個壞習慣。如果'JSON'爲'nil',則保證被正確初始化;如果不是,它不保證仍然是'無'或甚至是有效的。 – Kevin

+0

我在想,OjbC局部變量,不像語言中的ivars,持有垃圾值,除非明確初始化,我偏執的程序員更喜歡防守。但是,它似乎是用'nil'創建的。 – BergQuester

+0

不,如果你沒有初始化他們,他們就會持有垃圾(這就是爲什麼我說不壞習慣),但即使你初始化了它,如果通話成功,他們也不能保證在通話結束後仍然有效。 – Kevin