iOS json解析器错误

时间:2013-11-13 11:43:40

标签: ios objective-c json sigabrt

我正在尝试使用json从数据库中获取数据。该程序在我使用json解析器获取数据之前工作,但在使用解析器时崩溃。有什么不对? json和peopleList都是NSMutableArray。你可以在这里找到缩短版的json:

{"persons":[{"id":3,"name":"Micke","userId":2,"expectations":"None","skills":"Many","description":"Yes I want to want","experience":"From everywhere","created_at":"2013-09-27T07:48:55.612Z","updated_at":"2013-09-27T07:48:55.612Z"}]}

这里的代码:

{
NSURL *url = [NSURL URLWithString:getDataURL];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
peopleList = [[NSMutableArray alloc]init];


for (int i =0; i<json.count; i++) {
    NSString * pId = [[json objectAtIndex:i]objectForKey:@"id"];
    NSString * pName = [[json objectAtIndex:i]objectForKey:@"name"];
    NSString * pUserId = [[json objectAtIndex:i]objectForKey:@"userId"];
    NSString * pExpectations = [[json objectAtIndex:i]objectForKey:@"expectations"];
    NSString * pSkills = [[json objectAtIndex:i]objectForKey:@"skills"];
    NSString * pDescription = [[json objectAtIndex:i]objectForKey:@"description"];
    NSString * pExperience = [[json objectAtIndex:i]objectForKey:@"experience"];
    NSString * pCreatedAt = [[json objectAtIndex:i]objectForKey:@"created_at"];
    NSString * pUpdatedAt = [[json objectAtIndex:i]objectForKey:@"updated_at"];

    Person *person = [[Person alloc]
                       initWithID:pId andName:pName andUserId:pUserId andExpectations:pExpectations andSkills:pSkills andDescription:pDescription andExperience:pExperience andCreated_at:pCreatedAt andUpdated_at:pUpdatedAt];
    [peopleList addObject:person];
}

}

错误始于:

2013-11-13 19:26:51.644 FENA[1664:70b] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x109088fc0
2013-11-13 19:26:51.651 FENA[1664:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x109088fc0'

4 个答案:

答案 0 :(得分:2)

你有字典字典所以试试这个

NSString * pId = [[[json objectForKey:@"persons"] objectAtIndex:i] objectForKey:@"id"];
...

答案 1 :(得分:1)

您的json NSDictionary 。所以你不能使用 objectAtIndex:。你必须这样使用:

NSString * pId = [[[json objectForKey:@"persons"] objectAtIndex:i] objectForKey:@"id"];
NSString * pName = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"name"];
NSString * pUserId = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"userId"];
NSString * pExpectations = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"expectations"];
NSString * pSkills = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"skills"];
NSString * pDescription = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"description"];
NSString * pExperience = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"experience"];
NSString * pCreatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"created_at"];
NSString * pUpdatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"updated_at"];

答案 2 :(得分:1)

[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

返回字典,所以你必须使用它:

NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];


    for (int i =0; i<json.count; i++) {

    NSString * pId = [[[json objectForKey:@"persons"] objectAtIndex:i] objectForKey:@"id"];
    NSString * pName = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"name"];
    NSString * pUserId = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"userId"];
    NSString * pExpectations = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"expectations"];
    NSString * pSkills = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"skills"];
    NSString * pDescription = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"description"];
    NSString * pExperience = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"experience"];
    NSString * pCreatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"created_at"];
    NSString * pUpdatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"updated_at"];     

}

答案 3 :(得分:0)

因为JSON对象包含人物词典。

因此您需要将代码更改为:

{
    NSURL *url = [NSURL URLWithString:getDataURL];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    peopleList = [[NSMutableArray alloc]init];


    for (int i =0; i<json.count; i++) {
        NSString * pId = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"id"];
        NSString * pName = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"name"];
        NSString * pUserId = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"userId"];
        NSString * pExpectations = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"expectations"];
        NSString * pSkills = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"skills"];
        NSString * pDescription = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"description"];
        NSString * pExperience = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"experience"];
        NSString * pCreatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"created_at"];
        NSString * pUpdatedAt = [[[json objectForKey:@"persons"] objectAtIndex:i]objectForKey:@"updated_at"];

        Person *person = [[Person alloc]
                          initWithID:pId andName:pName andUserId:pUserId andExpectations:pExpectations andSkills:pSkills andDescription:pDescription andExperience:pExperience andCreated_at:pCreatedAt andUpdated_at:pUpdatedAt];
        [peopleList addObject:person];
    }

}