8

我对一些以这种方式格式化的服务的公共 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

4 回答 4

17

使用最新的 Web API,我解决了我的问题。

作为参考,旧的 Web API是: http ://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json

当前的Web API是: http ://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json&nojsoncallback=1

完成了

于 2013-09-25T06:58:33.320 回答
5

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

所以你必须想办法解决这个问题。例如,您可以在响应中搜索字符串jsonFlickrFeed(并将其删除,或者 - 更简单的方法 - 只是切断开头,直到有效的 JSON 开始并切断最后一个字符(应该是括号)。

于 2011-12-31T10:56:06.403 回答
3

Flickr does some bad things with their JSON that the parser can't cope with:

  • they start with 'jsonFlickrFeed(' and end with ')'
    • this means that the root object is not valid
  • they incorrectly escape single quotes .. eg. \'
    • this is invalid JSON and will make the parser sad!

For those looking to process the Flick JSON feed

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

Moral to the story - Flickr is naughty - smack.

于 2013-04-24T08:41:51.293 回答
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

就这样。

于 2020-09-16T08:26:02.353 回答