Swift中如何将JSON字符串转换为POST请求的正确格式?
解决POST请求中JSON序列化导致的422错误问题
我之前也踩过一模一样的坑!用字符串插值拼JSON简直是手动找罪受,稍微不注意就会出现引号未转义、结构缺漏的问题,服务器根本没法正确解析,直接把整个字符串当成单个字段返回422。至于字典转Data的运行时错误,大概率是字典里藏了JSON不支持的类型,或者序列化过程没做错误捕获。下面给你一步步捋清楚解决方案:
一、彻底抛弃字符串插值,用类型安全的Codable序列化(首推)
这是Swift里处理JSON最靠谱的方式,不仅能避免手动拼接的格式漏洞,还能在编译阶段就发现类型错误,完全告别莫名其妙的运行时问题。
步骤1:定义匹配JSON结构的模型
假设你要发送的JSON结构是这样的:
{ "username": "dropbear", "email": "dropbear@example.com", "age": 28 }
那对应的模型就这么写:
struct UserRequest: Codable { let username: String let email: String let age: Int }
步骤2:序列化模型并配置请求
用JSONEncoder把模型转成Data,重点!一定要设置请求的Content-Type头为application/json——很多人忽略这一步,服务器根本不知道你发的是JSON,自然会解析出错:
// 创建请求实例 var request = URLRequest(url: yourApiUrl) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 构造请求数据 let userRequest = UserRequest(username: "dropbear", email: "dropbear@example.com", age: 28) do { let jsonData = try JSONEncoder().encode(userRequest) request.httpBody = jsonData } catch { print("序列化错误:\(error.localizedDescription)") // 这里可以加错误处理逻辑,比如提示用户 return } // 发送请求 let task = URLSession.shared.dataTask(with: request) { data, response, error in // 处理响应逻辑 } task.resume()
二、如果一定要用字典转Data,解决运行时错误
要是你暂时不想用Codable,那得确保字典里的所有值都是JSON原生支持的类型(String、Int、Double、Bool、数组、字典,不能有Date、自定义对象这类未处理的类型),同时必须做好错误捕获:
var request = URLRequest(url: yourApiUrl) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let params: [String: Any] = [ "username": "dropbear", "email": "dropbear@example.com", "age": 28 ] do { let jsonData = try JSONSerialization.data(withJSONObject: params, options: []) request.httpBody = jsonData } catch { print("字典序列化错误:\(error)") // 打印错误信息能快速定位问题,比如是不是有不支持的类型 }
如果这里出现运行时错误,打印error的详细信息就能找到原因——比如字典里有Date类型,这时候需要先把它转成JSON兼容的格式(比如ISO8601字符串)再放进字典。
三、排查422错误的额外注意点
- 确认Content-Type头:必须设置为
application/json,服务器才会按照JSON格式解析请求体。 - 验证JSON有效性:可以把序列化后的Data转成字符串打印出来,用本地JSON校验工具检查格式——字符串插值拼出来的JSON经常会有引号未转义、逗号漏写的问题。
- 匹配服务器字段要求:422也可能是字段名拼写错误、缺少必填字段导致的,这时候要对比服务器文档检查你的请求结构。
内容的提问来源于stack exchange,提问作者dropbear
相关产品推荐
相关产品推荐

