如何在Alamofire中获取jsonSerializationFailed错误的Code值并处理?
解决Alamofire中Code=3840的JSON序列化错误捕获问题
这个错误是因为服务器返回的内容无法被解析为合法JSON,而3840是底层NSCocoaErrorDomain的错误码,它被嵌套在Alamofire的AFError结构里,所以需要逐层拆解错误才能精准捕获。下面给你两种实用的实现方式:
方式一:完整分支匹配(适合需要处理多种错误场景)
这种方式清晰展示了错误的层级结构,方便你后续扩展处理其他类型的Alamofire错误:
AF.request("你的接口地址").responseJSON { response in switch response.result { case .success(let data): // 处理成功返回的数据 print("请求成功:\(data)") case .failure(let error): // 先把错误转为AFError类型 guard let afError = error as? AFError else { print("非Alamofire错误:\(error)") return } // 匹配序列化失败的错误 switch afError { case .responseSerializationFailed(let failureReason): // 匹配JSON序列化失败的子原因 switch failureReason { case .jsonSerializationFailed(let underlyingError): // 检查底层错误的code是否为3840 if underlyingError.code == 3840 { // 这里添加你的提示逻辑,比如弹出Toast或Alert print("提示:数据格式错误,请稍后重试") } default: print("其他序列化失败错误:\(failureReason)") } default: print("其他Alamofire错误:\(afError)") } } }
方式二:简洁的模式匹配(适合只关注3840错误场景)
如果你的业务只需要处理这个特定错误,可以用if case的模式匹配简化代码,让逻辑更聚焦:
AF.request("你的接口地址").responseJSON { response in switch response.result { case .success(let data): // 处理成功逻辑 print(data) case .failure(let error): // 直接匹配嵌套的错误结构 if case .responseSerializationFailed(.jsonSerializationFailed(let underlyingError)) = error as? AFError, underlyingError.code == 3840 { // 展示提示信息 print("数据解析失败,请检查服务器返回内容或稍后重试") } } }
补充说明
出现这个错误的常见原因是服务器返回了非JSON格式的内容(比如纯文本"true"、HTML页面、或者格式不合法的JSON),捕获到这个错误后,你可以根据业务需求给用户友好的提示,比如“网络请求失败,请稍后再试”或者更具体的“数据格式异常”。
内容的提问来源于stack exchange,提问作者chandru kin
相关产品推荐
相关产品推荐

