使用Alamofire发起PUT请求时遇JSON写入_SwiftValue_类型错误求助
搞定Alamofire PUT请求的JSON序列化错误
嘿,这个问题我之前踩过坑!你遇到的NSInvalidArgumentException(提示Invalid type in JSON write (_SwiftValue)),本质原因是你传给Alamofire的参数里混了SwiftyJSON的JSON对象,而不是原生的Swift集合类型。
Alamofire的JSONEncoding只认原生的可序列化类型:比如String、Int、Bool,还有由这些类型组成的Array或[String: Any]字典。但你的clientsAry是SwiftyJSON封装后的JSON实例,系统没法直接把它转成JSON数据,所以就炸了。
快速解决办法
把SwiftyJSON对象转换成原生Swift类型就行,给你两种简单的方式:
方式1:用SwiftyJSON自带的转换属性
从打印结果看,clientsAry是数组类型(type: SwiftyJSON.Type.array),直接用arrayObject就能拿到原生的[[String: Any]]数组:
// 先把SwiftyJSON对象转成原生数组,记得处理可选值避免崩溃 guard let clientsNativeArray = clientsAry.arrayObject else { // 这里可以加个日志或者错误处理,比如提示数据格式不对 print("clientsAry不是有效的数组类型") return } // 用原生数组构建参数 let params = ["clients" : clientsNativeArray, "submitted" : 1]
方式2:手动构建原生字典数组
如果arrayObject偶尔抽风(比如嵌套结构转换有问题),也可以手动遍历SwiftyJSON数组,自己拼原生字典:
var clientsNativeArray: [[String: Any]] = [] // 遍历SwiftyJSON数组 for clientItem in clientsAry.arrayValue { let clientDict: [String: Any] = [ "id": clientItem["id"].rawValue, // rawValue会返回对应的原生类型(nil/Int) "hours": clientItem["hours"].stringValue, "client": [ "id": clientItem["client"]["id"].intValue, "name": clientItem["client"]["name"].stringValue ] ] clientsNativeArray.append(clientDict) } let params = ["clients" : clientsNativeArray, "submitted" : 1]
验证小技巧
修改完代码后再打印params,你会看到它变成了纯原生的Swift字典/数组,不再有SwiftyJSON的那些属性(比如rawArray、type),这时候Alamofire就能正常把参数序列化成JSON,顺利发起PUT请求啦。
内容的提问来源于stack exchange,提问作者Ioan Moldovan
相关产品推荐
相关产品推荐

