如何通过填充 NSDictionary 以 JSON 格式发送 UIImage

Posted

技术标签:

【中文标题】如何通过填充 NSDictionary 以 JSON 格式发送 UIImage【英文标题】:How to send UIImage in JSON format, by filling a NSDictionary 【发布时间】:2013-05-29 15:56:54 【问题描述】:

我正在尝试使用 JSON 将数据发送到服务器。 我可以使用我的对象和关键参数创建我的 NSDictionary。 但是我想发我的图片,图片是UIImage。

 NSDictionary* mainJSON = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"John",
                          @"First_Name",
                          @"McCintosh",
                          @"Last_name",
                          <HERE I WANT PICTURE>,
                          @"Profile_picture",
                          nil];

 // Here I convert to NSDATA 
 NSData * jsonData = [NSJSONSerialization dataWithJSONObject:mainJSON options:NSJSONWritingPrettyPrinted error:&error];

 // Sending operation :
 dispatch_async(kBgQueue, ^
                   
                       NSData * data = [NSData dataWithContentsOfURL:@"addresSERVER"];
                       [self performSelectorOnMainThread:@selector(receivedResponseFromServer:)
                                              withObject:data
                                           waitUntilDone:YES];
                   
                   );

所以我想知道如何在我的 NSDictionary 中添加我的图片? 因为我想发送我的图片内容。如果我添加我的对象 UIImage... 我会发送整个对象对吗?

谢谢

【问题讨论】:

好吧有趣...当您说“查看语法”时,这意味着有一种方法可以使用 Json 发送它?或者我应该改变解决方案? Hot Licks 是错误的。请参阅 Roman 的回答。 您不应将大图像(或其他大数据对象)作为 JSON 中的 Base64 发送。时间和空间上的开销很大,还有其他更好的方式来发送这些数据。 【参考方案1】:

您应该将 UIImage 转换为 NSString。使用名为 NSDataAdditions 的 NSData 类别。您可以在此处找到: NSDataAdditions category

如何使用:

//Convert an Image to String
UIImage *anImage;
NSString imageString = [UIImagePNGRepresentation(anImage) base64Encoding];

//To retrieve
NSData *data = [NSData dataWithBase64EncodedString:imageString];
UIImage *recoverImage = [[UIImage imageWithData:data];

【讨论】:

大家都知道,NSData 有自己的 base64EncodedStringWithOptions: 从 ios7 开始的方法,不再需要类别了。【参考方案2】:

我通常不会使用 JSON 发布图片。虽然技术上可以将图像编码为文本,但我认为 JSON 的用途并非如此,我个人会避免这种做法。

将图像作为 NSData 处理。他们就是这样。网上有很多例子illustrate how to do this。

一种常见的方法是将图像上传到网络服务器,然后获取上传图像的 URL 并将 that 添加到您的 JSON 字典中,以便您提交的 JSON 字典带有一个表示要下载的图片的 URL——不是图片本身。

【讨论】:

我也会分别上传图片和 JSON。 +1 感谢分享知识,现在我明白 JSON 只支持字符串数字和布尔值。但是,如果我对图像进行编码是可能的……您如何看待 Roman 的解决方案?看起来不错不是吗?目前我只是在进行 base64encoding 工作时遇到问题......或者我应该忘记 JSON 并尝试链接“说明如何执行此操作”中的解决方案 @manonthemoon 我认为 Roman 的答案在技术上可能有效,但它使用 JSON 的方式并非真正打算使用,而且我可以通过几种方式看到它出错了。以“更好”的方式执行此操作只需稍微多一点工作 - 例如,编码图像,上传图像,然后获取上传图像的 URL,将其添加到您的 JSON 字典,然后上传 JSON 字典。我包含的链接准确地显示了如何编码和上传图像本身。 @manonthemoon 这是正确的做法,您不应将数据嵌入 JSON 中。 @manonthemoon 仅供参考,对于下载和上传数据,我个人使用AFNetworking,这是一个强大的 iOS/MacOSX 网络库。您也应该检查一下。【参考方案3】:

您可以尝试使用 NSString 发送 UIImage,如下所示: 斯威夫特 3:

if let jpegData = UIImageJPEGRepresentation(image, 1.0) 
    var encodedString = jpegData.base64EncodedString()
    var mainJSON = [
        "First_Name" : "John",
        "Last_name" : "McCintosh",
        "Profile_picture" : encodedString
    ]


目标-c:

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSString *encodedString = [imageData base64Encoding];


 NSDictionary* mainJSON = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"John",
                          @"First_Name",
                          @"McCintosh",
                          @"Last_name",
                          encodedString,
                          @"Profile_picture",
                          nil];

这是 Base64 格式,因此您可以用任何语言对其进行解码

【讨论】:

好的,我要试试这个解决方案 :) 我会在几分钟后给你反馈。谢谢 嘿,对于 UIImageJPEGRepresentation,它可以正常工作。但是对于base64encoding,他找不到方法。我有这个警告:'没有可见的@interface 声明选择器 base64 编码' @manonthemoon 我认为base64encoding 是在 NSData 类别中实现的自定义方法。我找到了一个同名的here,也许你可以使用它。 [NSData base64Encoding] 自 iOS 7 起已弃用,请使用 [NSData base64EncodedStringWithOptions:]【参考方案4】:

好的,感谢@tolgamorf 和@isaac,我尝试使用AFNetwork。 我可以做我想做的事。它功能强大且简单。

NSURL *url = [NSURL URLWithString:@"http://api-base-url.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar.jpg"], 0.5);
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST"  path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
[formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg"  mimeType:@"image/jpeg"];
];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) 
NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
];
[httpClient enqueueHTTPRequestOperation:operation];

我从here 获取官方文档中的代码。

享受

【讨论】:

以上是关于如何通过填充 NSDictionary 以 JSON 格式发送 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

通过过滤另一个 NSDictionary 来获取一个 NSDictionary

如何从使用 JSONKit 创建的 NSDictionary 中正确填充 UITableView NSArray?

Objective-C 使用 NSDictionary 的实例填充表视图

用 NSDictionary 填充数组

从 NSDictionary 填充 tableview

如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?