You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
    }
}

关键修改说明

  1. 修正Content-Type头:API要求表单格式的请求体,因此需设置Content-Type为application/x-www-form-urlencoded,而非把参数塞到头里。
  2. 正确传递POST参数:将请求参数通过httpBody传递,转换为UTF-8编码的Data。
  3. 新增响应状态码检查:快速判断请求是否成功,避免后续无效的JSON解码操作。
  4. 添加原始响应打印:方便排查API返回的内容是否符合预期,若解码仍失败,可通过打印的字符串确认问题。

内容的提问来源于stack exchange,提问作者S L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:34:58