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

Alamofire multipart/form-data请求无法传递字典数组报错如何解决?

问题原因

你对product_review_skin_concerns字段的序列化逻辑错误:直接通过"\(val)"把Swift字典转成了原生描述字符串,服务端收到的是纯文本而非预期的结构化字典类型,因此触发类型校验报错。

解决方案

根据服务端的接收规则二选一即可:

方案1:按multipart数组规范拼接字段名

如果服务端按标准表单格式解析数组,需要给字段名带上索引和字典层级标识,修改对应代码块:

if key == "product_review_skin_concerns" {
    guard let arr = value as? [[String:Any]] else { return }
    // 遍历数组带索引
    for (index, val) in arr.enumerated() {
        // 遍历字典内的键值对拼接完整字段名
        for (dictKey, dictValue) in val {
            let fullKey = "\(key)[\(index)][\(dictKey)]"
            multipartFormData.append("\(dictValue)".data(using: .utf8)!, withName: fullKey)
        }
    }
}

方案2:整个数组序列化为JSON字符串传输

如果服务端要求该字段直接接收JSON格式的字符串,用JSON序列化代替Swift原生字符串转换:

if key == "product_review_skin_concerns" {
    guard let arr = value as? [[String:Any]], 
          let jsonData = try? JSONSerialization.data(withJSONObject: arr),
          let jsonStr = String(data: jsonData, encoding: .utf8) else { return }
    multipartFormData.append(jsonStr.data(using: .utf8)!, withName: key)
}

内容的提问来源于stack exchange,提问作者NewUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:57:01