如何在Swift中从API调用获取原始JSON字符串
解决URLSession获取到包含HTTP头的JSON响应问题
看起来你的服务器返回的响应格式不太标准——它把HTTP状态行、响应头和JSON响应体混在一起返回了,正常情况下URLSession会自动帮你拆分响应头(在HTTPURLResponse对象里)和响应体(就是responseData),所以这大概率是服务器端的配置问题。不过咱们可以先在客户端处理一下,拿到你需要的原始JSON字符串:
修复步骤
- 把
responseData转换成字符串后,通过\n\n(空行)分割,因为标准HTTP响应中头和体是用空行分隔的 - 取分割后的第二部分,就是纯JSON内容了
下面是修改后的代码片段:
let task = URLSession.shared.dataTask(with: request) {(responseData, response, error) in DispatchQueue.main.async { guard error == nil else { print("ERROR: \(String(describing: error))") return } guard let data = responseData else { print("Data was not retrieved from request") return } // 把data转成字符串,然后分割出头和体 if let fullResponseString = String(data: data, encoding: .utf8) { // 按空行分割,取后面的JSON部分 let parts = fullResponseString.components(separatedBy: "\n\n") if parts.count >= 2 { let rawJsonString = parts[1] print("原始JSON字符串: \(rawJsonString)") // 如果需要解析JSON的话,用这个rawJsonString转回data再解析 if let jsonData = rawJsonString.data(using: .utf8) { let jsonResponse = try? JSONSerialization.jsonObject(with: jsonData, options: []) if let responseDict = jsonResponse as? [String: Any] { print("解析后的响应:") dump(responseDict) } else { print("JSON格式有误") } } } else { print("响应格式不符合预期,无法拆分") } } else { print("无法将响应数据转成UTF-8字符串") } } } task.resume()
重要提醒
虽然客户端可以临时处理,但更推荐你排查服务器端的配置——标准的HTTP响应应该由服务器将头和体分开发送,这样URLSession会自动把响应体放在responseData里,响应头可以通过response as? HTTPURLResponse获取,不需要自己手动拆分。
内容的提问来源于stack exchange,提问作者Darrell Brogdon
相关产品推荐
相关产品推荐

