【问题标题】:deserialization of an image from json using NSJSONSerialization使用 NSJSONSerialization 从 json 反序列化图像
【发布时间】:2013-09-20 10:45:27
【问题描述】:

我正在尝试使用 NSJsonSerialization 反序列化来自服务器的 JSON。服务器返回一个转换为字符串的 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 反序列化错误:操作无法完成。(Cocoa 错误 3840。)”。 我认为问题在于 JSON 的格式。但是那些写服务器端的人说他们可以成功地反序列化这个对象。有什么建议如何处理这个 JSON?

【问题讨论】:

  • 你得到的是 Base64 格式的 PNG 吗?
  • 您对此网络服务有任何控制权吗?让 Web 服务返回嵌入的图像是不好的形式。如果可能,让 Web 服务返回图像的链接。 {"photo": "http://<host>/<path>/<image>.png" }。它将减少每个 Web 服务消息的大小并允许客户端缓存图像。
  • 我需要获取有关用户的信息。每个用户都有一个头像。如果需要,我需要从服务器下载此信息以脱机使用。所以我们的想法是通过一个请求下载所有信息,而不是分开下载每张图片。

标签: ios objective-c json nsjsonserialization


【解决方案1】:

ImageData不能直接转给NSString, 你可以通过GMTBase64来做到这一点:

编码

NSString *imgStr = [GTMBase64 stringByEncodingData:imageData];

解码

NSData *imageData = [GTMBase64 decodeString:imageStr];

转换成图片

UIImage *image = [[UIImage alloc]initWithData:imageData];

【讨论】:

    【解决方案2】:

    据我所知,JSON 响应必须是字符串。您获得的图像看起来像图像数据,它使用NSPropertyListErrorMinimumCocoa 错误域:3840)破坏了 JSON 解析。服务器端 JSON 需要发送编码为 base64 字符串的图像。这将使 JSON 在客户端保持有效..

    您可以对 base64 编码的图像进行解码,以在客户端获取图像数据。使用this NSData category,它将帮助您将base64 字符串解码为NSData

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多