- [__ NSCFDictionary objectAtIndex:]:发送到实例的无法识别的选择器

时间:2014-08-29 23:11:05

标签: ios objective-c json

我正在尝试解析我的iOS应用的API。但是,由于某种原因,API会返回我无法解析的JSON(使用NSJSONSerialization)。由于我不知道player1和player2的名字,我不能使用objectForKey(在测试中,前者知道player1是玩家的名字等,有效)。所以我使用objectAtIndex导致崩溃," - [__ NSCFDictionary objectAtIndex:]:无法识别的选择器发送到实例"。
JSON:

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

对象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);
}

由于

2 个答案:

答案 0 :(得分:1)

参赛者是字典,而不是数组。 :)

您可以使用NSObject isKindOfClass方法检查已解析的JSON的元素是字典还是数组,然后相应地处理它们。

如果要通过索引访问字典的值,可以通过调用NSDictionary的allValues方法来检索值的数组。

答案 1 :(得分: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]);
   }
}