4

我有一个NSString "[{"van" : 1,312, "vuan":12,123}]并且为了获得每个键的这个值,我这样做:

    NSData *data1 = [jsonResponse1 dataUsingEncoding:NSUTF8StringEncoding];
    jsonArray = [NSJSONSerialization JSONObjectWithData:data1 options:kNilOptions error:&err];

    self.van = [NSMutableArray arrayWithCapacity:1];
    self.vuan = [NSMutableArray arrayWithCapacity:1];

    for (NSDictionary *json in jsonArray) {
        NSString * value = [json objectForKey:@"van"];
        [self.van addObject:value];
        lbl1.text = value;

        NSString * value1 = [json objectForKey:@"vuan"];
        [self.vuan addObject:value1];
        lbl4.text = value1;
    }

可能我不必使用数组,而是NSData直接在NSDictionary.

无论如何,我不明白为什么jsonArrayis nil,尽管jsonResponse1包含我上面写的值。

编辑:我的老板写错了 json 字符串。谢谢大家的建议!:)

4

2 回答 2

13

您的 JSON 无效。修理它。这个网站是你的朋友。

http://jsonlint.com/

于 2013-03-07T07:49:13.183 回答
1

您需要更有防御性地编写代码,并且需要在发现错误时报告错误。

首先检查JSON解析是否失败,如果是则报告错误:

 NSData *data1 = [jsonResponse1 dataUsingEncoding:NSUTF8StringEncoding];
jsonArray = [NSJSONSerialization JSONObjectWithData:data1 options:kNilOptions error:&err];
if (jsonArray == nil)
{
    NSLog(@"Failed to parse JSON: %@", [err localizedDescription]);
    return;
}

其次,如果这些键不在 JSON 中,objectForKey:将返回nil,当您尝试将其添加到数组时,它将引发异常,这是您要避免的:

for (NSDictionary *json in jsonArray) {
    NSString * value = [json objectForKey:@"van"];
    if (value != nil)
    {
        [self.van addObject:value];
        lbl1.text = value;
    }
    else
    {
         NSLog(@"No 'van' key in JSON");
    }

    NSString * value1 = [json objectForKey:@"vuan"];
    if (value1 != nil)
    {
        [self.vuan addObject:value1];
        lbl4.text = value1;
    }
    else
    {
        NSLog(@"No 'vuan' key in JSON");
    }
}

总而言之:会发生运行时错误,因此您需要确保处理它们。当它们发生时,您需要尽可能多地报告它们,以便您可以诊断和修复它们。

于 2013-03-07T07:50:52.013 回答