如何使用对象C中的多个实例解析JSON

时间:2012-10-06 07:23:14

标签: iphone objective-c xcode json

  

可能重复:
  How to use NSJSONSerialization

我正在测试在iphone应用程序上使用我的网站的Web服务。 有问题的JSON是:

[
    {
        "name": "Jason1",
        "age": 20
    },
    {
        "name": "Jason2",
        "age": 40
    },
    {
        "name": "Jason3",
        "age": 60
    }
]

我的代码:

   NSData *jasonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost:3000/all_personal_information.json"]];
    NSDictionary *json = nil;
    if (jasonData) {
        json = [NSJSONSerialization JSONObjectWithData:jasonData options:kNilOptions error:nil];
    }

代码可以正常使用{"name":"jason","age":20} 我可以使用json[@"name"]json[@"age"]

来获取值

但我不知道如何从问题中获取JSON的值。 我试图使用[json enumerateKeysAndObjectsWithOptions]横切字典。 但我会收到一个错误:

enumerateKeysAndObjectsWithOptions:usingBlock:]: unrecognized selector sent to instance 0x89b2490

但是当我将[json description]记录到控制台时,我可以获得完整的JSON。

3 个答案:

答案 0 :(得分:2)

当你得到一个数组时,你正在创建一个字典。如果你这样做,它应该工作:

id json = nil;
if (jasonData)
{
    json = [NSJSONSerialization JSONObjectWithData:jasonData options:kNilOptions error:nil];
}

if ([json isKindOfClass:NSArray.class])
{
    for (id personDef in json)
    {
        if ([personDef isKindOfClass:NSDictionary.class])
        {
            NSDictionary * dict = (NSDictionary *) moduleDef;

            NSString * name  = [dict objectForKey:@"name" withClass:NSString.class];

            NSLog(@"Person: @%", name);
        }
    }
}

在这里,我做了一些额外的检查,看看对象是否是我们期望的对象。如果不是这种情况,则应添加(正确)错误处理。

答案 1 :(得分:2)

将它带入数组......例如

NSData *jasonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost:3000/all_personal_information.json"]];
NSDictionary *json = nil;
if (jasonData) {
    NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:jasonData options:NSJSONReadingMutableContainers error: &e];
}

数组将包含您的

{
 "name": "Jason1",
 "age": 20
}
单个索引中的

等。当你想要获取其中的值时,可以使用以下方法获取值

NSDictionary *userName = [jsonArray objectAtIndex:1];
NSString *stringName = [userName valueForKey:@"name"];

答案 2 :(得分:1)

它会帮助你。

     NSMutableDictionary *CompaintsAry =[NSJSONSerialization JSONObjectWithData:respo options:kNilOptions error:&error];
     NSMutableArray *tempary =[[NSMutableArray alloc]init];
    for (int i=0;i < [CompaintsAry count];i++) {
    CfResultFatch *rs = [[CfResultFatch alloc] initWithName:[[CompaintsAry obj ectAtIndex:i]objectForKey:@"Name"]
                                                     cipd :[[CompaintsAry objectAtIndex:i] objectForKey:@"Age"]];

    [tempary addObject:rs];
}
cfComlaintsLists = [[NSMutableArray alloc] initWithArray:tempary];
SelectComplain = [[NSMutableArray alloc] initWithCapacity:[cfComlaintsLists count]]; 
[chiftab reloadData];