десериализация изображения из json с помощью NSJSONSerialization

Я пытаюсь десериализовать JSON, поступающий с сервера, с помощью NSJsonSerialization. Сервер возвращает изображение png, преобразованное в строку. Вот мой код:

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        NSError *deserializationError;
        id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&deserializationError];
        if (deserializationError) {
            NSLog(@"JSON deserialization error: %@", deserializationError.localizedDescription);
            return;
        }
} ];

Вот что я получаю от сервера:

{"photo":"�PNG\r\n\u001A\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000:\u0000\u0000\u0000:\b\u0002\u0000\u0000\u0000n��\u007F\u0000\u0000\u001FrIDATx�}z\u0005W[y��|��..."}

Но у меня есть ошибка при разборе JSON: «Ошибка десериализации JSON: операция не может быть завершена. (Ошибка какао 3840.)». Я думаю, что проблема в формате JSON. Но ребята, которые пишут на стороне сервера, говорят, что могут успешно десериализовать этот объект. Любые предложения, как справиться с этим JSON?


person PSsam    schedule 16.09.2013    source источник
comment
Вы получаете формат PNG Base64?   -  person Rajan Balana    schedule 16.09.2013
comment
У вас есть какой-либо контроль над этим веб-сервисом? Если веб-служба возвращает встроенное изображение, это плохой тон. Если возможно, попросите веб-службу вернуть ссылку на изображение. {"photo": "http://<host>/<path>/<image>.png" }. Это сократит размер каждого сообщения веб-службы и позволит клиенту кэшировать изображение.   -  person Jeffery Thomas    schedule 16.09.2013
comment
Мне нужно получить информацию о пользователях. У каждого пользователя есть аватар. Мне нужно загрузить эту информацию с сервера, чтобы использовать ее в автономном режиме, если это необходимо. Таким образом, идея заключалась в том, чтобы загрузить всю информацию одним запросом, а не загружать каждое изображение отдельно.   -  person PSsam    schedule 16.09.2013


Ответы (2)


Насколько я знаю, ответ JSON должен быть строкой. Изображение, которое вы получаете, выглядит как данные изображения, которые нарушают синтаксический анализ JSON с помощью NSPropertyListErrorMinimum (Домен ошибки Cocoa: 3840). JSON на стороне сервера должен отправлять изображение, закодированное в виде строки base64. Это позволит сохранить JSON действительным на стороне клиента.

Вы можете декодировать изображение в кодировке base64, чтобы получить данные изображения на стороне клиента. Используйте эту категорию NSData, которая поможет вам декодировать строку base64 в NSData.

NSData *imageData = [NSData dataWithBase64EncodedString:base64JSONString];
// Create image with data
UIImage *image = [[UIImage alloc] initWithData:imageData];

Надеюсь, это поможет!

person Amar    schedule 16.09.2013

ImageData не может напрямую передать NSString, это можно сделать с помощью GMTBase64:

Кодировать

NSString *imgStr = [GTMBase64 stringByEncodingData:imageData];

Расшифровать

NSData *imageData = [GTMBase64 decodeString:imageStr];

Преобразовать в изображение

UIImage *image = [[UIImage alloc]initWithData:imageData];
person Kalpit Gajera    schedule 16.09.2013