我正在尝试向和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/

10-13 06:32