我正在尝试向和api发送一个post请求,该请求包含一个“项”列表,可以是图像或文本。
但是,我总是得到一个错误(在标题中列出)
下面是将我的对象转换为JSON的代码
var json = [String: Any]()
var jsonItems = [Any]()
for i in 0...(items.count - 1){
var it = [String: Any]()
if let imageData = items[i].image?.jpgData(){
it["image"] = imageData
}
if let text = items[i].text{
it["text"] = text
}
if i == 0 {
it["is_profile"] = true
it["face_detected"] = faceDetected
}
jsonItems.append(it)
}
json["items"] = jsonItems
是否有任何原因无法正确格式化?
编辑:
jpgData函数
func jpgData() -> Data? {
return UIImageJPEGRepresentation(self, 0.8)
}
导致崩溃的示例代码:
extension Dictionary {
var json: String {
let invalidJson = "Not a valid JSON"
do {
let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)
return String(bytes: jsonData, encoding: String.Encoding.utf8) ?? invalidJson
} catch {
return invalidJson
}
}
}
除了我的示例代码之外,将创建的dict作为Alamofire请求、URLSession请求等的参数传递都会导致标题错误的崩溃
编辑:解决方案
图像数据确实需要编码。事后觉得很明显。Base64编码可以像在我的扩展中那样打印出结构,但是对于网络请求,我最终使用了Alamofire的MultipartFormData类(它周围的一个自定义包装器),并将其作为mimetype的
application/octet-stream
追加。希望我能在这里使用facepalm表情符号。我接受了两个关于编码的答案中的一个。 最佳答案
转换为JPEG数据后,尝试将编码设置为base64
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
查看此答案以获取更多信息Convert between UIImage and Base64 string
关于json - 快速格式化JSON:JSON写入类型无效(OS_dispatch_data),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52213838/