2011-07-27 46 views
0

我有一個iPhone應用程序從服務器獲取json字符串並對其進行解析。它包含一些數據,例如學校時間表信息。數據存儲在nsdictionary中,然後傳遞給nsmuttablearray。例如iphone訂單json數組

有人能請我指出正確的方向/告訴我如何訪問數組的不同「根」?我希望將「Day」這個字段的元素存儲爲「Monday」(或者你可以告訴我如何通過它們來排序/執行搜索)。花了相當一段時間試圖找到關於這個的一些信息(如何訪問/改變嵌套值),但沒有運氣= /。謝謝..

回答

1

你最好的賭注=星期一會使用謂詞具有重要途徑是什麼你以後......

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Day == 'Monday'"]; 
NSArray* mondayCourses = [rows filteredArrayUsingPredicate:predicate]; 

您可以斷言的動態了。

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Day == %@", dayOfTheWeek]; 

其中dayOfTheWeek可能是保存一週的當天在一個循環等

如果要排序的數組,你可以這樣做使用排序描述符一個NSString。

NSSortDescriptor* idSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" 
                    ascending:YES]; 
NSSortDescriptor* levelSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Level" 
                     ascending:YES]; 
NSArray* sortedMondayRows = [mondayRows sortedArrayUsingDescriptors:[NSArray arrayWithObjects:idSortDescriptor, levelSortDescriptor, nil]]; 
+0

感謝您的答覆。關於謂詞,當我嘗試傳遞值時,例如rows = mondayCourses我的程序崩潰,沒有任何東西在控制檯中。行是nsarray格式,你有什麼想法? –

+0

如果我正確查看示例JSON結構,則NSDictionary「rows」將只保存一個具有「Array」鍵的鍵/值對。所以你需要創建一個如下所示的數組: NSArray * courses = [rows objectForKey:@「Array」]; 然後,你可以幾乎逐字使用我的謂詞代碼(只需更改[rows filteredArrayUsingPredicate:predicate]; [courses filteredArrayUsingPredicate:predicate];) –

+0

謝謝,真的很有幫助答案:] –

0

檢查您的JSON在URL中是否正確:http://jsonlint.com/。 如果正確的話,請閱讀如何通過Google搜索解析JSON文件。 您是否使用任何特定的框架來解析JSON文件?

+0

了JSON解析是好的,我只是不明白如何操作數據,一旦我有它變成一個muttablearray(我上面貼的是內部數組) –

0

從關於NSArrayNSDictionary的Apple文檔開始。在這種情況下,它看起來像數組(NSArray)包含一些NSDictionaries。

數據存儲在nsdictionary中,然後傳遞到nsmuttablearray。

首先,我必須注意Objective-C中的變量只是指針。當你有這樣一行:

NSMutableArray *rows; 

你只說:「我希望這個變量指向一個NSMutableArray。」這是幾乎等同於,

id rows; 

,而且你會不會在運行時停止將常規數組放入一個聲明爲可變數組的變量中(或將一個字符串放入一個聲明爲字典的變量中!)。它會工作!但是當你試圖對一個非可變數組做一些可變的事情時,或者將一些事情字典化爲一個字符串時,你的程序就會崩潰。

聲明爲一個指向一個NSMutableArray,而不是ID,有幾個優點:

  • 它允許的XCode爲您排憂解難通過自動填充方法名
  • 它可以讓編譯器警告你,當你嘗試要調用的NSMutableArray沒有

所以,即使你的變量聲明爲NSMutableArray *rows方法,在這條線:

rows = [[dict objectForKey:@"courses"] retain]; 

...如果「課程」對象不可變,您在rows中所擁有的內容不是可變的。相反,你可以這樣做:

rows = [[dict objectForKey:@"courses"] mutableCopy]; 

...得到陣列的自己NSMutableArray的副本(您必須釋放,就好像你保留了原)。


您可以使用標準Cocoa代碼探索數組和字典。這裏將是讓所有的「星期一」課程的一種方法:

NSMutableArray *mondayCourses = [NSMutableArray array]; 

for (NSDictionary* course in rows){ 
    if([[course objectForKey:@"Day"] isEqual:@"Monday"]){ 
     [mondayCourses addObject:course]; 
    } 
} 

訪問所有與天字典對象(警告,我還沒有運行該代碼)