Alamofire如何发送无外层键的JSON对象数组请求
解决方案
方案一(推荐,适用于Alamofire 5及以上版本)
Alamofire 5及以上版本原生支持直接传入Encodable类型作为请求参数,无需转换为[String: Any]类型字典,不会自动添加外层键:
struct Something: Codable { var thing: String? = nil } // 构造参数数组 let params = [Something(thing: "")] // 发起请求,使用JSONParameterEncoder而非JSONEncoding AF.request( path, method: .put, parameters: params, encoder: JSONParameterEncoder.default, headers: headers ).response { response in // 处理响应逻辑 }
最终生成的请求体就是你需要的纯对象数组结构:
[ { "thing": "" } ]
方案二(兼容低版本Alamofire)
如果使用的是不支持Encodable参数的旧版本Alamofire,可以手动编码数组为JSON Data后设置到请求体:
do { let params = [Something(thing: "")] // 整体编码数组为JSON Data let jsonData = try JSONEncoder().encode(params) var request = URLRequest(url: URL(string: path)!) request.httpMethod = HTTPMethod.put.rawValue request.allHTTPHeaderFields = headers.dictionary request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = jsonData // 发起请求 AF.request(request).response { response in // 处理响应逻辑 } } catch { print("参数编码失败: \(error.localizedDescription)") }
原方案失效原因说明
之前查到的方案多为手动将单个模型转为JSON字符串后拼接数组,没有做整体的JSON序列化,因此会得到字符串数组而非对象数组。
内容的提问来源于stack exchange,提问作者DevinM
相关产品推荐
相关产品推荐

