2011-12-30 71 views
5

我有格式化这样NSJSONSerialization

serveices问题,一些公共服务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); 

回答

5

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

所以你将不得不建立一个解决这个问题的方法。你可以例如搜索字符串jsonFlickrFeed(在响应中,并删除它或 - 更简单的方法 - 只是切断开始,直到有效的JSON启动并切断最后一个字符(应该是括号)

3

的Flickr确实与他们的JSON一些不好的事情分析器无法应付:

  • 他们开始与“jsonFlickrFeed(”和结束“)”
    • 这意味着根对象是不有效
  • 他们不正确地转义单引号..例如。 \'
    • 这是无效的JSON,并会使解析器伤心!

对于那些希望处理弗里克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是淘气 - 咂嘴