我正在尝试为iOS编写一个Facebook Feed应用程序,而我正在尝试使用JSON框架,效果不大。每当我运行我的代码时,我都会收到错误“ * 因未捕获的异常而终止应用程序'NSInvalidArgumentException',原因:'data parameter is nil'”。我使用来自Flickr的提要作为测试/演示URL,因为Facebook URL是使用访问令牌请求和appendToString以编程方式创建的:。
NSURL *url2 = [NSURL URLWithString:@"www.flickr.com/services/feeds
/photos_public.gne?tags=punctuation&someKey=atsign&format=json"];
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:url2];
if (data == nil){
NSLog(@"data is nil");
}
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:nil];
NSLog(@"json: %@\n\n Or Error: %@", json, [error localizedDescription]);
编辑:我更改了我的代码以包含错误和NSlog,并更改了URL(根据海报ilis的建议),以及添加if语句来测试数据是否为零(感谢海报Dustin为了这个想法)。现在我从NSLog获得一个输出,声明“json:(null)或错误:操作无法完成。(Cocoa error 3840。)”,并且if语句没有响应。所以我认为当创建NSDictionary json时会出现问题。
答案 0 :(得分:1)
您的网址创建错误。当您使用无效的网址致电dataWithContentsOfURL
时,您将获得nil
NSData
。 JSON序列化方法需要一个NSData
对象,但获取nil
,因此它会抛出NSInvalidArgumentException
。
您的方法中没有任何内容看起来不正确,您只需要检查您的网址是否有效。在尝试执行JSON序列化之前,最好检查data
是否为nil
。
如何检查数据是否为零
if (data == nil)
{
//handle the problem
}
else
{
//You have valid content, do something with it
}
答案 1 :(得分:1)
Flickr使用解析器无法处理的JSON做了一些不好的事情:
对于那些希望处理Flick JSON提要的人
//get the feed
NSURL *flickrFeedURL = [NSURL URLWithString:@"http://api.flickr.com/services/feeds/photos_public.gne?format=json&tags=data"];
NSData *badJSON = [NSData dataWithContentsOfURL:flickrFeedURL];
//convert to UTF8 encoded string so that we can manipulate the 'badness' out of Flickr's feed
NSString *dataAsString = [NSString stringWithUTF8String:[badJSON bytes]];
//remove the leading 'jsonFlickrFeed(' and trailing ')' from the response data so we are left with a dictionary root object
NSString *correctedJSONString = [NSString stringWithString:[dataAsString substringWithRange:NSMakeRange (15, dataAsString.length-15-1)]];
//Flickr incorrectly tries to escape single quotes - this is invalid JSON (see http://stackoverflow.com/a/2275428/423565)
//correct by removing escape slash (note NSString also uses \ as escape character - thus we need to use \\)
correctedJSONString = [correctedJSONString stringByReplacingOccurrencesOfString:@"\\'" withString:@"'"];
//re-encode the now correct string representation of JSON back to a NSData object which can be parsed by NSJSONSerialization
NSData *correctedData = [correctedJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:correctedData options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"this still sucks - and we failed");
} else {
NSLog(@"we successfully parsed the flickr 'JSON' feed: %@", json);
}
答案 2 :(得分:0)
我在StackOverflow上发现了答案:NSJSONSerialization。
事实证明,Flickr的JSON Feed格式不正确,因此数据填充的信息上面有NSJSONSerialization
无法处理的前缀。