无法访问Objective-C中的JSON数据

时间:2013-07-07 20:51:23

标签: iphone ios objective-c json

好的,这是我在Objective-C中使用JSON的第一种方法(我也是最后一种方法)。我要在我的json中存储信息以在Objective-C中使用它们,但是当我尝试加载它时,我会在NSLog(@"%@",allData);的响应中得到null。谁能告诉我我做错了什么?提前感谢您的时间和耐心。 哦,如果需要这里是json: http://jsonviewer.stack.hu/#http://conqui.it/ricette.json

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"recipes" ofType:@"json"];

NSError *error = nil;

NSMutableData *JSONData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error];
NSLog(@"%@",JSONData);


NSArray *allData = [NSJSONSerialization JSONObjectWithData:JSONData options:0 error:nil];
NSLog(@"%@",allData);

for (NSDictionary *diction in allData) {
    NSString *recipe = [diction objectForKey:@"recipe"];

    [array addObject:recipe];
}

NSLog(@"%@",array);

2 个答案:

答案 0 :(得分:4)

JSONObjectWithData方法有一个error参数,您可以利用该参数来诊断问题。例如:

NSError *error = nil;
NSArray *allData = [NSJSONSerialization JSONObjectWithData:JSONData
                                                   options:0
                                                     error:&error];
if (error)
    NSLog(@"%s: JSONObjectWithData error: %@", __FUNCTION__, error);

在您的评论中,您建议您收到有关“字符414周围未转义控制字符”的错误消息。这表明JSON本身存在错误,您可能希望通过复制到http://jsonlint.com/进行验证,并查看它是否报告任何问题。

在回答关于是否存在任何Objective-C问题的更广泛问题时,没有编码错误,本身。我无法对for循环明确评论假设allData是一个字典数组,在没有看到JSON的情况下我无法证明这些字典。但我会接受你的话。但是,是的,Objective-C代码看起来很好(尽管有点检查返回值类型和错误对象)。

例如,如果您想要在开发期间使用某些诊断断言语句,则可能会执行以下操作:

NSArray *allData = [NSJSONSerialization JSONObjectWithData:JSONData options:0 error:nil];
NSAssert(error, @"%s: JSONObjectWithData error: %@", __FUNCTION__, error);

NSLog(@"%s: array=%@", __FUNCTION__, array);

NSAssert([allData isKindOfClass:[NSArray class]], @"allData is not an array");

for (NSDictionary *diction in allData) {
    NSAssert([diction isKindOfClass:[NSDictionary class]], @"%s: diction is not a dictionary (%@), __FUNCTION__, diction);

    NSString *recipe = [diction objectForKey:@"recipe"];

    NSAssert(recipe, @"%s: Did not find recipe key in diction (%@)", __FUNCTION__, diction);

    [array addObject:recipe];
}

如果这些错误中的任何一个可能是生产中的运行时错误,那么您将使用执行必要错误处理的if语句替换assert语句。但希望它说明了这个概念。

答案 1 :(得分:0)

您的回答中的问题是,字符串值无法连接。所以,我必须手动删除这些标签和新行。

在五个地方你会收到错误,即:

<强> pelate。

<强>面食。

<强>番茄

<强> saporiti)。

<强> \吨

- (void)viewDidLoad
{
    NSString *urlStr=[NSString stringWithFormat:@"http://www.conqui.it/ricette.json"];

    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *fileNameURL=[NSURL URLWithString:urlStr];

    NSLog(@"url is %@",urlStr);

    NSMutableURLRequest *filenameReq=[[NSMutableURLRequest alloc] initWithURL:fileNameURL];
    NSData *responseData=[NSURLConnection sendSynchronousRequest:filenameReq returningResponse:nil error:nil];

    NSString *responseString=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    responseString=[[responseString componentsSeparatedByString:@"\n"] componentsJoinedByString:@""];
    responseString=[responseString stringByReplacingOccurrencesOfString:@"\t" withString:@""];

    responseData=[responseString dataUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"response String is %@",responseString);

    [NSCharacterSet characterSetWithCharactersInString:responseString];

    NSError *e = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options: 0 error: &e];

    NSLog(@"JSON Array is %@ & error is %@",jsonArray,e);

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}