Swift调用情感分析API解码JSON时报错“The given data was not valid JSON”
Swift调用情感分析API解码JSON失败的解决方案
问题根源
你的代码核心错误在于POST请求的参数传递方式完全错误:
- 错误地将请求参数
text=great设置到了Content-Type请求头中,导致API无法正确解析请求,返回的不是预期的JSON数据(可能是错误页面),最终触发JSON解码失败。
修正方案
以下是修复后的完整代码,关键修改点已标注:
结构体定义(无需修改)
struct Result : Codable{ var probability: Probability var label: String struct Probability: Codable{ var neg: Double var neutral: Double var pos: Double } }
修复后的网络请求代码
class ResponseData: ObservableObject{ @Published var result: [Result] = [] func API() { guard let url = URL(string: "http://text-processing.com/api/sentiment/") else { fatalError("Invalid URL") } var request = URLRequest(url: url) // 1. 设置正确的Content-Type头 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" // 2. 将请求参数放入httpBody request.httpBody = "text=great".data(using: .utf8) let session = URLSession.shared let dataTask = session.dataTask(with: request) { [weak self] data, response, error in guard let self = self else { return } if let error = error { print("Request error: \(error)") return } // 3. 新增:检查HTTP响应状态码,确认请求成功 guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("Invalid HTTP response") return } guard let data = data else { print("No data received") return } // 可选:打印原始响应数据,方便排查问题 if let responseString = String(data: data, encoding: .utf8) { print("Raw response: \(responseString)") } DispatchQueue.main.async { do { let decodedResult = try JSONDecoder().decode(Result.self, from: data) self.result = [decodedResult] print("Decoded result: \(self.result)") } catch let error { print("Decoding error: \(error)") } } } dataTask.resume() } }
关键修改说明
- 修正Content-Type头:API要求表单格式的请求体,因此需设置
Content-Type为application/x-www-form-urlencoded,而非把参数塞到头里。 - 正确传递POST参数:将请求参数通过
httpBody传递,转换为UTF-8编码的Data。 - 新增响应状态码检查:快速判断请求是否成功,避免后续无效的JSON解码操作。
- 添加原始响应打印:方便排查API返回的内容是否符合预期,若解码仍失败,可通过打印的字符串确认问题。
内容的提问来源于stack exchange,提问作者S L
相关产品推荐
相关产品推荐

