我认为我需要一些帮助来找出正确的NSJSONSerialization选项,以使我的问题消失。
在我的应用中,我允许用户从图库中选择图像 - 图像经历以下内容:
NSData *imageData = UIImageJPEGRepresentation(self.profileImageView.image, 0.0);
然后
NSString *stringOfImageData = [imageData base64EncodedStringWithOptions:0];
之前像这样序列化:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postDict
options:NSJSONWritingPrettyPrinted
error:&error];
然后发送到我的REST API。然后我使用base64在python中解码它,如下所示:
profileImageData = base64.b64decode(request.json['image'])
然后将其加载到GridFS(mongodb)中。在提取数据以发送回应用程序时,我先使用dumps()将其发送回base64,然后再将其编码为base64:
dumps(base64.b64encode(fs.get_last_version(request.json['userID']).read()))
在接收数据后的iOS中,它通过以下反序列化:
[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]
我已经将问题缩小到最后一个NSJSONSerialization命令。应用程序收到数据后,它可以打印到屏幕。在序列化之后,我得到一个'nil':(
序列化和反序列化对于字符串,整数等工作非常有用 - 当我试图移动图像数据时它不起作用。
由于
编辑:我能够针对API运行curl请求,然后使用在线base64到图像转换器,我可以看到我的图像。所以它肯定意味着问题在于iOS方面解码json编码的base64字符串。
编辑:当我反复运行反序列化时 - 每20次左右,数据被正确转换。我认为解决方案可能必须打破即将发布的数据。
编辑:错误:
parsed error:Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unterminated string around character 17.) UserInfo=0x109c08790 {NSDebugDescription=Unterminated string around character 17.}
答案 0 :(得分:0)
您没有说的是您如何接收数据。我的猜测是你在收到所有数据之前尝试解码数据,但因为我不知道它是如何猜测的。
为了更好地了解正在发生的事情,请尝试记录数据的大小和哈希值,以查看长度是否有所不同。您还可以将每个接收的数据对象保存到文件系统 - 将它们放在Documents文件夹中,然后您可以从Mac访问它们。如果大小永远不变,那么你必须将一个好的数据对象与一个坏的数据对象进行比较。
实际上,您可以编写一些代码来将图像保存为数据和base64字符串,上传,然后将其拉回并保存。现在比较数据和字符串。一旦找到差异,那就看看吧。它从一开始就有什么偏差?它有什么不同?
当你明白这一切时,你就可以解决它。