NSJSONSerialization

时间:2011-12-30 22:26:50

标签: json ios5 nsjsonserialization

我遇到一些公共json服务的问题 以这种方式格式化的服务

jsonFlickrFeed({
        "title": "Uploads from everyone",
        "link": "http://www.flickr.com/photos/",
        "description": "",
        "modifi ... })

NSJSONSerialization似乎无法开展工作

NSURL *jsonUrl = [NSURL URLWithString:@"http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=yahoo&callback=YAHOO.Finance.SymbolSuggest.ssCallback"];
NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:jsonUrl options:kNilOptions error:&error];
NSMutableDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
NSLog(@"%@", jsonResponse);

4 个答案:

答案 0 :(得分:14)

答案 1 :(得分:5)

我认为NSJSONSerialization无法处理JSON代码中的 jsonFlickrFeed(...)。问题是纯响应是无效的JSON(测试它here)。

所以你必须围绕这个问题建立一个方法。例如,您可以在响应中搜索字符串 jsonFlickrFeed()并删除它 - 或者更简单 - 只需切断开头直到有效的JSON开始并切断最后一个字符(应该是托架)。

答案 2 :(得分:3)

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);
}

故事的道德 - Flickr顽皮 - smack

答案 3 :(得分:0)

问题是Flickr以jsonp(带有填充的JSON)格式而不是json格式返回数据,因此要解决此问题,只需在Flickr URL中添加以下内容:

nojsoncallback=1

因此,如果URL是:

https://www.flickr.com/services/feeds/photos_public.gne?format=json

然后将其更改为:

https://www.flickr.com/services/feeds/photos_public.gne?format=json&nojsoncallback=1

仅此而已。