Swift Alamofire中如何将普通JSON转换为转义JSON字符串?
解决Swift Alamofire中转义JSON字符串的问题
嘿,我之前用Alamofire开发时刚好碰到过一模一样的需求!服务器要的其实是把整个JSON结构当成一个转义后的字符串来接收,而不是直接传JSON对象。下面给你两种实用的解决方法:
方法一:用JSONSerialization处理字典(适合无模型场景)
如果你是从响应中拿到了[String: Any]类型的字典,直接用系统的JSONSerialization就能完成转换:
// 假设这是你从响应解析得到的JSON字典 let responseDict: [String: Any] = [ "status": 1, "id": "1bcc3331b09d32f7439ad9d5f2acfb35", "progress": [ [ "airline_code": "SRI", "ctr": 0, "rate": 5, "state": 1, "data": nil ] ] ] do { // 第一步:把字典序列化成Data let jsonData = try JSONSerialization.data(withJSONObject: responseDict, options: []) // 第二步:把Data转成字符串,自动完成双引号转义 if let escapedJsonString = String(data: jsonData, encoding: .utf8) { // 用debugPrint可以看到原始的转义字符(控制台直接print会自动显示未转义的) debugPrint(escapedJsonString) // 输出结果就是服务器需要的格式: // "{\"status\":1,\"id\":\"1bcc3331b09d32f7439ad9d5f2acfb35\",\"progress\":[{\"airline_code\":\"SRI\",\"ctr\":0,\"rate\":5,\"state\":1,\"data\":null}]}" } } catch { print("JSON序列化失败:\(error.localizedDescription)") }
方法二:用Codable模型处理(类型安全,推荐)
如果你的项目用了Codable来解析响应(这也是Alamofire推荐的方式),可以先定义对应模型,再编码成转义字符串:
第一步:定义Codable模型
struct ProgressItem: Codable { let airlineCode: String let ctr: Int let rate: Int let state: Int let data: String? // 若data可能为null,用可选类型即可;特殊情况可自定义NilCodable // 处理下划线命名的字段 enum CodingKeys: String, CodingKey { case airlineCode = "airline_code" case ctr, rate, state, data } } struct ResponseModel: Codable { let status: Int let id: String let progress: [ProgressItem] }
第二步:将模型编码为转义字符串
// 假设这是你从Alamofire响应解析得到的模型实例 let responseModel = ResponseModel( status: 1, id: "1bcc3331b09d32f7439ad9d5f2acfb35", progress: [ ProgressItem( airlineCode: "SRI", ctr: 0, rate: 5, state: 1, data: nil ) ] ) do { let encoder = JSONEncoder() // 不需要额外配置,默认编码就会生成转义后的字符串 let jsonData = try encoder.encode(responseModel) if let escapedJsonString = String(data: jsonData, encoding: .utf8) { debugPrint(escapedJsonString) } } catch { print("模型编码失败:\(error.localizedDescription)") }
注意事项:发送请求时的正确姿势
拿到转义后的字符串后,要确保它是作为字符串参数传递给服务器,而不是再次被Alamofire序列化。比如如果服务器要求参数名为json,请求代码应该是这样:
let parameters: [String: Any] = [ "json": escapedJsonString // 直接传转义后的字符串 ] AF.request("你的服务器接口地址", method: .post, parameters: parameters, encoding: URLEncoding.default) .responseJSON { response in // 处理服务器响应 }
内容的提问来源于stack exchange,提问作者themasmul
相关产品推荐
相关产品推荐

