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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:36:30