You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:02:31