Alamofire纯布尔值响应解析失败求助:仅可修改指定方法
解决方案
问题出在SwiftyJSON的初始化方式错误,以及未处理Alamofire解析纯布尔值可能出现的边界情况:
1. 修改firebaseTokenService方法
原代码直接用response.data初始化SwiftyJSON,未利用Alamofire已经解析好的JSON结果;同时补充手动解析的 fallback 逻辑,兼容服务器返回纯文本布尔值的场景:
func firebaseTokenService(request: URLRequestConvertible, completion: @escaping (_ httpResponse: HTTPURLResponse?, _ responseObject:JSON?, _ error: Error?) -> Void) { session.request(request, interceptor: nil).validate().responseJSON { (response) in switch response.result { case .success(let parsedValue): // 用Alamofire解析后的结果初始化SwiftyJSON,直接拿到布尔值 let json = JSON(parsedValue) completion(response.response, json, nil) case .failure(let error): // 若JSON解析失败(比如服务器返回text/plain格式的"true"/"false"),手动解析 if let data = response.data, let responseStr = String(data: data, encoding: .utf8) { let boolResult = responseStr.lowercased() == "true" completion(response.response, JSON(boolResult), nil) } else { completion(response.response, nil, error) } } } }
2. 调用逻辑无需修改
原有的闭包判断逻辑可以正常工作,现在jsonData?.boolValue能正确获取接口返回的布尔值:
NetworkManager.shared().firebaseTokenService(request: APIRouter.firebasetoken(param as [String : Any]), completion: { (httpResponse, jsonData, error) in if httpResponse?.statusCode == 200 { if let responseText = jsonData?.boolValue { print(responseText ? "Success to send fcm token" : "Failed to send fcm token") } else { print("Invalid response format") } } else { print("Failed to send fcm token", error?.localizedDescription ?? "") } })
关键说明
- Alamofire的
responseJSON支持解析顶级布尔值(符合JSON规范),直接使用result.value即可拿到解析后的布尔值,无需手动处理原始Data。 - 补充手动解析逻辑是为了兼容服务器可能返回的纯文本格式(如直接返回字符串
"true"而非JSON布尔值),避免解析失败导致的jsonData为nil。
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

