好的,这是我在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);
答案 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.
}