2014-08-29 37 views
-4

我試圖解析我的iOS應用程序的API。但是,由於某種原因,API返回JSON,我似乎無法解析(使用NSJSONSerialization)。由於我不知道player1和player2的名字,所以我不能使用objectForKey(在測試中,我知道player1是玩家的名字等)。所以我使用objectAtIndex導致崩潰,「 - [__ NSCFDictionary objectAtIndex:]:無法識別的選擇器發送到實例」。
JSON:- [__ NSCFDictionary objectAtIndex:]:無法識別的選擇器發送到實例

{ 
    "id": "idnumb", 
    "numentrants": 2, 
    "entrants": { 
    "player1": { 
    "displayname": "player1", 
    "otherdata": 1234, 
    }, 
    "player2": { 
     "displayname": "player2", 
     "otherdata": 5678, 
    } 
    } 
} 

的OBJ C:

NSError *jsonParsingError = nil; 
NSDictionary *eventArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError]; 

for(int i = 0; i < [[eventArray objectForKey:@"entrants"] count]; i++) 
{ 
    NSArray *entrantsArray = [[eventArray objectForKey:@"entrants"] objectAtIndex:i]; 
    NSLog(@"%@", entrantsArray); 
} 

由於

+0

如果您是Google您的問題標題,那麼*第一個*引用是您的副本。 (或者,相反,你的是一個重複的。) – 2014-08-30 00:11:16

+0

順便說一句,你應該去json.org和學習JSON語法。學習只需要5-10分鐘,而且知道它會讓你免於提出類似的重複問題。 – 2014-08-30 02:06:02

+0

標記的副本上的信息沒有解決問題。但是,nzeltzer的allValues解決方案確實如此。 – eaofkaefaefa4fa4fa4f 2014-08-30 03:07:49

回答

1

參賽者是一個字典,而不是陣列。 :)

您可以使用NSObject isKindOfClass方法來檢查解析的JSON的元素是字典還是數組,然後適當地處理它們。

如果要按索引訪問字典的值,可以通過調用NSDictionary的allValues方法來檢索值的數組。

+0

將其更改爲字典會導致相同的問題,'NSDictionary * entrantsArray = [[eventArray objectForKey:@「entrants」] objectAtIndex:i];' – eaofkaefaefa4fa4fa4f 2014-08-29 23:26:00

+0

id events = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError]; //然後用isKindOfClass檢查類型。如果它是一本字典,您可以通過密鑰訪問。如果它是一個數組,你可以通過索引訪問。如果由於某種原因您想要通過索引訪問字典的值,請使用allValues方法來獲取字典值的數組。 – nzeltzer 2014-08-29 23:27:38

+0

'NSDictionary * entrantsArray = [[[specificRaceArray objectForKey:@「entrants」] allValues] objectAtIndex:i];'似乎工作,感謝allValues提示! – eaofkaefaefa4fa4fa4f 2014-08-29 23:31:46

1

您的JSON數據中沒有任何對象是數組,只有字典。您需要像字典那樣枚舉它,而不是數組,例如:

NSDictionary *entrants = [eventArray objectForKey:@"entrants"]; 
for(NSString *playerName in entrants) 
{ 
    NSLog(@"%@", playerName); 

    NSDictionary *playerData = [entrants objectForKey:playerName]; 
    for (NSString *dataName in playerData) 
    { 
     NSLog(@"%@: %@", dataName, [playerData objectForKey:dataName]); 
    } 
} 
+0

你是完全正確的:沒有陣列在望! – nzeltzer 2014-08-29 23:31:16

相關問題