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

Swift JSON POST请求:无法移除响应数组括号问题求助

解决Swift中JSON数组响应的解析问题

看起来你卡在了JSON数组的解析上——其实根本不需要手动移除数组括号,JSONDecoder可以直接处理数组类型的JSON响应,咱们一步步来修正你的代码:

1. 先完善请求头(可选但推荐)

你的POST请求没有设置Content-Type,很多服务器需要这个头来识别请求体是JSON格式,所以先补上这一行:

request.setValue("application/json", forHTTPHeaderField: "Content-Type")

2. 正确解析JSON数组响应

你之前把响应数据直接转成字符串传给DataModel的做法是错误的,应该用JSONDecoder直接解析成字符串数组,再初始化你的模型。

首先确保你的DataModel能接收字符串数组(如果还没定义好,参考下面的结构):

struct DataModel {
    let quotes: [String]
}

然后修改数据任务的回调部分:

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 检查请求错误
    if let error = error {
        self.delegate?.didGetError(error: error)
        return
    }
    
    // 确保响应数据存在
    guard let data = data else {
        let noDataError = NSError(domain: "DataError", code: -1, userInfo: [NSLocalizedDescriptionKey: "未接收到响应数据"])
        self.delegate?.didGetError(error: noDataError)
        return
    }
    
    do {
        // 直接解析成[String]类型,自动处理数组括号
        let quotesArray = try JSONDecoder().decode([String].self, from: data)
        let quotes = DataModel(quotes: quotesArray)
        self.delegate?.didGetData(data: quotes)
    } catch {
        self.delegate?.didGetError(error: error)
        print("JSON解析失败:\(error.localizedDescription)")
    }
}
task.resume()

为什么之前的方法不行?

你之前把data转成字符串后直接传给DataModel,相当于把带[]的整个字符串当成了单个quote,而不是解析里面的多个字符串元素。手动移除括号不仅容易出错(比如遇到转义的括号、特殊字符),也完全没必要——JSONDecoder天生支持解析数组类型。

如果你的DataModel结构和上面不一样,只需要调整解析的类型即可,比如如果模型有嵌套结构,就对应修改decode()里的类型参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:22:36