Swift中如何将error.localizedDescription转为JSON并解析?
问题解决:Swift中无法从Cloud Functions错误字符串提取JSON字段
错误原因
你当前的message是String类型(来自error.localizedDescription),并非字典或可直接下标的JSON对象,所以直接用message["status"]这种方式访问字段会报错。
解决方案
方法1:用JSONSerialization解析字符串
将JSON格式的字符串转为Data,再解析成字典后访问字段:
functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let messageStr = error.localizedDescription // 1. 将字符串转为Data guard let data = messageStr.data(using: .utf8) else { print("无法将错误字符串转为Data") return } // 2. 解析为字典 do { if let errorDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { let status = errorDict["status"] as? String let errorMessage = errorDict["message"] as? String print("状态:\(status ?? ""),错误信息:\(errorMessage ?? "")") } } catch { print("JSON解析失败:\(error)") } let details = error.userInfo[FunctionsErrorDetailsKey] } } }
方法2:用Codable做类型安全解析
定义匹配JSON结构的模型,通过JSONDecoder解析,适合复杂错误结构的场景:
// 定义错误响应模型 struct FunctionErrorResponse: Codable { let message: String let status: String } // 调用函数时解析 functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let messageStr = error.localizedDescription guard let data = messageStr.data(using: .utf8) else { print("无法转换字符串为Data") return } do { let errorResponse = try JSONDecoder().decode(FunctionErrorResponse.self, from: data) print("状态:\(errorResponse.status),错误信息:\(errorResponse.message)") } catch { print("解析失败:\(error)") } let details = error.userInfo[FunctionsErrorDetailsKey] } } }
更简便的方式:直接使用error的details字段
Firebase Functions返回的错误详情已经存在error.userInfo[FunctionsErrorDetailsKey]中,这个字段通常是已解析好的字典/对象,无需再处理localizedDescription:
functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) // 直接从details中提取字段 if let details = error.userInfo[FunctionsErrorDetailsKey] as? [String: Any] { let status = details["status"] as? String let message = details["message"] as? String print("状态:\(status ?? ""),错误信息:\(message ?? "")") } } } }
这个方法最直接,推荐优先使用——因为localizedDescription可能被系统处理成本地化字符串,不一定是原始的JSON结构。
内容的提问来源于stack exchange,提问作者Taro
相关产品推荐
相关产品推荐

