SwiftUI调用登录API崩溃求助:Thread 14错误排查
问题排查与解决步骤
这个错误的核心原因是:你尝试解析的接口返回内容不是标准的JSON数组或对象,可能是接口返回了HTML错误页、纯文本提示,或是请求本身出错导致返回非JSON数据。以下是具体排查和修复方法:
1. 先查看接口返回的原始内容
在解析JSON前,先打印接口返回的原始数据,确认实际内容:
// 修改你的URLSession请求代码,添加原始数据打印 let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("请求出错:\(error.localizedDescription)") return } // 打印原始响应字符串 if let data = data, let rawContent = String(data: data, encoding: .utf8) { print("接口返回内容:\(rawContent)") } // 原有的解析代码... } task.resume()
运行后看控制台输出,大概率会发现返回的是404/500错误页面、纯文本提示,而非预期的JSON数据。
2. 检查请求的合法性
- 请求方法:确认接口
loginScanAccount要求用POST还是GET,多数登录接口为POST,检查你是否用错了请求方法。 - 请求头:如果是传JSON参数,需设置
Content-Type: application/json;如果是表单参数,需对应设置application/x-www-form-urlencoded,确保头信息符合接口要求。 - 参数格式:检查登录参数(如账号、密码)的键名是否拼写正确,参数是否按接口要求的格式传递(比如是否需要包裹成JSON字符串)。
3. 修复JSON解析逻辑
如果接口确实存在非JSON返回的场景(比如成功返回JSON,失败返回纯文本),可以开启允许解析JSON片段的选项:
do { // 添加.allowFragments选项,允许解析单个JSON值(如字符串、数字) let jsonResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) // 处理解析结果 } catch { print("解析失败:\(error.localizedDescription)") }
注意:这只是临时妥协方案,核心还是要确保接口返回合法的JSON对象/数组。
4. 处理HTTP响应异常
添加状态码判断,避免在请求出错时强行解析JSON:
if let httpResponse = response as? HTTPURLResponse { print("响应状态码:\(httpResponse.statusCode)") // 4xx/5xx状态码表示请求出错,直接返回不解析 if httpResponse.statusCode >= 400 { return } }
常见额外坑点
- 确认接口地址是否正确:检查域名、端口号、路径是否拼写错误。
- 模拟器网络权限:确保模拟器能正常访问外部网络,可直接用浏览器打开
https://foldlab.io:8081/loginScanAccount测试连通性。
内容的提问来源于stack exchange,提问作者Athellan
相关产品推荐
相关产品推荐

