JSON数据未填充

时间:2012-07-31 13:47:47

标签: objective-c ios json

我正在尝试为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时会出现问题。

3 个答案:

答案 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做了一些不好的事情:

  • 他们以'jsonFlickrFeed('并以'结尾'开头)
    • 这意味着根对象无效
  • 他们错误地逃脱单引号..例如。 \”
    • 这是无效的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无法处理的前缀。