2011-11-17 77 views
1

我可以成功地解析JSON文件的內容,使用JSON-Framework 3.0中,但我不能夠提取的NSArray的所有元素。不能訪問的NSArray的內容對JSON框架iPhone

在這條線(如下所示)link = [myJsonArray objectAtIndex:0];應用崩潰給我在控制檯上這樣的信息:-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x70ea20

這裏是我的代碼:

NSError *error; 
NSString *link; 
NSArray *myJsonArray; 

NSString *jsonString = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myJSONfile" ofType:@"json"] encoding:NSUTF8StringEncoding error:&error]; 

SBJsonParser *parser = [[SBJsonParser alloc] init]; 
myJsonArray = [[parser objectWithString:jsonString error:&error] copy]; 
[parser release]; 

link = [myJsonArray objectAtIndex:0]; 

NSLog(@"json returns: %@", myJsonArray); 

,這裏是我的JSON文件:

{ 
    "Programs": [ 
     {"link1": "http://www.myWebSite1.aspx", 
     "program name": "Live Show at 9", 
     "speaker": "Dr. Speaker 1"}, 
     {"link2": "http://www.myWebSite2.aspx", 
     "name": "Dr. Speaker 2", 
     "speaker": "Live Show at 10"} 
    ] 
} 

這是日誌輸出:

JSON Output: { 

    Programs =  (
     { 
     link1: "http://www.myWebSite1.aspx", 
     program name: "Live Show at 9", 
     speaker: "Dr. Speaker 1"}, 

    {link2: "http://www.myWebSite2.aspx", 
     program name: "Dr. Speaker 2", 
     speaker: "Live Show at 10"} 
); 
} 

我到底做錯了什麼?謝謝你的幫助!

回答

1

返回要訪問你應該使用LINK1值:

[[[myJsonArray objectForKey:@"Programs"] objectAtIndex:0] objectForKey:@"link1"] 
+0

仍然顯示所有元素,我不知道爲什麼。 – Winston

+0

也許是因爲你正在記錄整個對象。試試NSLog(@「link1:%@」,[[[myJsonArray objectForKey:@「Programs」] objectAtIndex:0] objectForKey:@「link1」]) – javieralog

+0

現在我明白了!雖然我收到了這個警告:語義問題:'NSArray'可能不會響應'objectForKey:'任何想法爲什麼?謝謝! – Winston

1

您發送objectAtIndex:到NSDictionary中這是錯誤的。試試打印你分配給myJsonArray的東西,看看它是否是一個有效的數組。

+0

是的,myJsonArray是一個有效的數組,我可以看到它的所有使用控制檯上打印出來的元素NSLog(@「json返回:%@」,myJsonArray); – Winston

+0

不,myJsonArray是一個NSDictionary,因爲控制檯和每個人都在告訴你。你可以檢查調用isKindOfClass:[NSArray class] – javieralog

+0

我做了,是的,你們是完全正確的。感謝您指出了這一點。今天,我已經與你們所有人學到了很多! – Winston

1

確保您的JSON文件中的文本與[開始,以]結束。在這種情況下,objectWithString:應該返回一個數組。

現在,它似乎返回NSDictionary,如果您的文件以{開頭並以}結尾,則會發生這種情況。

+0

我有[...和開始我的JSON文件,並...]和結束。裏面,元素有{...}。我試着改變{...},並且NSArray返回NULL。 – Winston

+0

今天我學到了很多東西!非常感謝 !!! – Winston

1

解析器返回的NSDictionary,而不是一個NSArray你的情況。

訪問該對象之前添加

NSLog(@"json returns: %@", myJsonArray); 

,並在控制檯看到的結果。

+0

我用NSLog看到JSON文件的所有元素(@「json returns:%@」,myJsonArray);我無法將它們全部分離成單獨的NSStrings。 – Winston

+0

請嘗試將該日誌輸出和原始JSON文件的最相關部分發布到您的問題中。 – Till

+0

今天我跟你們學到了很多東西!!!!非常感謝 !!! – Winston

-1

你最有可能有無效的JSON。嘗試將您的JSON文本粘貼到http://jsonlint.com/並查看它是否有效。

+0

OP在他的評論中指出他/她從日誌中獲得了正確的輸出 - > JSON是有效的,或者SBJSON將無法完全解析它。 – Till

+0

我認爲這是不可能成爲正確的JSON,如果他可以交換'''''''而不會出現JSON錯誤。我不知道第三方解析器如何對錯誤的JSON做出反應,可以默默忽略。如果在控制檯上輸出,它可能看起來是正確的... – Mundi

2

你的對象是一個字典。數組可以通過訪問

NSArray *aLinkArray = [myJasonArray valueForKey:@"Programs"] 
+0

通過這行代碼,控制檯顯示數組中的每個元素作爲一個組,顯示:link1,程序名和揚聲器。我如何將它們中的每一個(鏈接1,程序和揚聲器)在單獨的NSStrings中分開? – Winston

+0

[[aLinkArray objectAtIndex:0] valueForKey:@「link1」] – Jim

+0

仍然顯示所有元素,我不知道爲什麼。 – Winston