NSJSONSerialization - PullRequest
       40

NSJSONSerialization

7 голосов
/ 31 декабря 2011

У меня проблемы с некоторыми публичными службами 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);

Ответы [ 3 ]

14 голосов
/ 25 сентября 2013

Используя новейший веб-API, я решил свою проблему.

Для справки, старый веб-API : http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json

Текущий веб-API : http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json&nojsoncallback=1

Готово .

5 голосов
/ 31 декабря 2011

Я думаю, что NSJSONSerialization не может справиться с jsonFlickrFeed (...) в вашем коде JSON.Проблема в том, что чистый ответ - недопустимый JSON (проверьте его здесь ).

Так что вам придется обойти эту проблему.Например, вы можете найти строку jsonFlickrFeed ( в ответе) и удалить ее или - более простой способ - просто обрезать начало до тех пор, пока не запустится допустимый JSON, и не обрезать последний символ (который должен быть скобкой)).

3 голосов
/ 24 апреля 2013

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 капризный - чмок .

...