在swift中格式化JSON:JSON写入中的类型无效(OS_dispatch_数据)
我正在尝试向和api发送一个post请求,其中包含一个可以是图像或文本的“项目”列表 然而,我一直收到一个错误(列在标题中) 下面是将我的对象转换为JSON的代码在swift中格式化JSON:JSON写入中的类型无效(OS_dispatch_数据),json,swift,Json,Swift,我正在尝试向和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].im
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的
应用程序/octet流
。但愿我能在这里使用facepalm表情符号。我接受了两个关于编码的答案中的一个,这两个答案实际上包含示例代码。数据不能放入JSON。必须对数据对象进行编码。可能使用base64编码。转换为JPEG数据后,请尝试编码为base64
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
查看此答案以了解更多信息返回的是什么类型的
jpgData()
JSON不支持原始数据。您需要将图像数据转换为base64encodedString,才能将其发送到您的json@daredevil1234您发布的代码没有给出错误。您发布的代码不做任何JSON处理,它只是构建了一个字典。用实际给出错误的代码更新您的问题。已更新。参见编辑