Запрос iTunes JSON в iOS возвращает объект XML

Я хочу получить доступ к информации из iTunes в приложении для iOS.

Я делаю обычный http-запрос (отправляю параметры как POST, так и непосредственно в URL-адресе)

URL-адрес работает, потому что если я использую браузер, я получаю ожидаемый результат (в формате JSON).

{ "resultCount": 0, "результаты": [] }

Но в iOS JSONObjectWithData возвращает нулевой объект.

После проверки объекта данных я обнаружил, что возвращенный объект представляет собой объект XML (который не содержит требуемой информации, а содержит набор ключей/значений XML]

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://itunes.apple.com/search"]];

NSError *directError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&directError];

if (!directError) {
    NSLog(@"%@", jsonDict);

} else {
    NSLog(@"JSON Error: %@", directError.localizedDescription);        
}

Я просмотрел любой возможный параметр POST, чтобы заставить ответ быть JSON, но ничего не нашел.

Прилагается пример информации, содержащейся в объекте данных (после разбора XML):

меню

ключевое название

ключ Музыка

строка URL

ключ https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewGenre?id=34

строковые элементы

ключевое название

ключ Бесплатно в iTunes

строка URL

С уважением... Энрике


person eharo2    schedule 24.03.2014    source источник
comment
Можете ли вы показать, какой URL вы проверяете? Itunes API возвращает json, как вы можете видеть здесь: itunes.apple.com/search?term= Джек+Джонсон   -  person Alex    schedule 24.03.2014
comment
Я использовал itunes.apple.com/search в вопросе, чтобы выделить короткий ответ JSON { resultCount: 0, результаты: [] }. Я пробовал http и https   -  person eharo2    schedule 24.03.2014
comment
Я проверяю это, и он работает с этим URL. Если вы хотите проверить полученные данные, например: jsonDict[@results][0][@trackName]   -  person Alex    schedule 24.03.2014
comment
Я предполагаю, что вы явно не запрашиваете JSON, и многие сайты вернут XML, если вы не запросите JSON. (Хотя я точно забыл, как вы запрашиваете JSON.)   -  person Hot Licks    schedule 24.03.2014


Ответы (3)


ОБНОВЛЕНИЕ: я также рекомендую вам не использовать метод NSData dataWithURL для получения содержимого, поскольку он инициирует запрос синхронно. Если вы запрашиваете много данных, это заморозит поток пользовательского интерфейса. Для выборки почти всегда следует использовать асинхронные операции.

Я использую следующий код, и он возвращает ответ JSON, который позже преобразуется в объект json, как показано ниже:

-(void) setup
{
    NSString *iTunesURL = @"https://itunes.apple.com/search?term=pink-floyd";

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:iTunesURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

        NSLog(@"SUCCESS");

    }] resume];
}
person azamsharp    schedule 24.03.2014
comment
Привет @azamsharp ... Я сделал, как вы предлагаете (запустите NSURLSession с dataTaskWithURL, но по какой-то странной причине возвращаемый объект данных (который можно проверить) не в формате JSON, а в формате XML ... Когда я передаю объект NSData через класс NSJSONSerialization, возвращаемый объект равен нулю. Если я запускаю его через NSXMLParser, он получает длинный список ключей, как показано в приложении к исходному вопросу. Я озадачен здесь. Любая помощь будет оценена... A пример защиты с ошибкой опубликован здесь - person eharo2; 27.03.2014

Возможно, это приведет к тому, что ответ будет в формате JSON вместо XML:

NSUrlSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" };

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];

[[session dataTaskWithURL:[NSURL URLWithString:@"http://itunes.apple.com/search"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

}] resume];

Это использует заголовки по умолчанию из Chrome. Вы также можете попробовать это:

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : @"text/json" };

И если это не сработает:

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : @"text/json, application/json" };
person mithunc    schedule 15.04.2014

Я также столкнулся с этой проблемой, и хотя возвращаемые данные выглядят как XML, после анализа HTTP-трафика Apple возвращает URL-адрес перенаправления, который пытается открыть iTunes на устройстве. Изменив пользовательский агент NSMutableURLRequest, я смог вернуть JSON.

    let session = NSURLSession.sharedSession();

    let request = NSMutableURLRequest(URL:NSURL(string:"https://itunes.apple.com/search?term=wwg&country=us&media=software")!);
    request.HTTPMethod = "GET";
    //Be seen as the Mac OS
    request.addValue("Paw/2.3.3 (Macintosh; OS X/10.11.4) GCDHTTPRequest", forHTTPHeaderField: "User-Agent")
    //OR if you want to be seen as Chrome
    //request.addValue("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", forHTTPHeaderField: "User-Agent")

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        self.delegate?.didFinishSearching(data, response: response, error: error);
    }
    task.resume();
person BretD    schedule 12.05.2016