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

Swift中如何对JSON字典类型的属性进行Decodable解码?

报错截图

问题原因

你的SEConfirmAuthorizationResponse解码逻辑本身没有问题,报错是因为JSONDecoder只接受Data类型的入参,你直接传入[String: Any]类型的字典,触发了类型不匹配的错误。

可用解决方案

方案1:调整返回值为Data类型(推荐)

修改工具方法的返回值,直接返回JSON格式的Data,省略字典转Data的中间步骤:

// 修改原有属性的返回类型
static var validConfirmAuthorizationData: Data { 
    return jsonData("valid_confirm_authorization_data") 
}

// 解码调用示例
let decoder = JSONDecoder()
let response = try decoder.decode(SEConfirmAuthorizationResponse.self, from: validConfirmAuthorizationData)

方案2:将现有字典转成Data再解码

如果无法修改validConfirmAuthorizationData的返回类型,可以先把字典序列化为JSON Data再执行解码:

// 现有字典转Data
let jsonDict = validConfirmAuthorizationData
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])

// 执行解码
let decoder = JSONDecoder()
let response = try decoder.decode(SEConfirmAuthorizationResponse.self, from: jsonData)

可选优化

你可以简化嵌套解码的代码写法,不需要单独定义第二层的CodingKeys,改用嵌套结构体实现,可读性更高:

public struct SEConfirmAuthorizationResponse: Decodable {
    public let id: String
    public let success: Bool

    // 定义嵌套结构体对应data字段的结构
    private struct DataContainer: Decodable {
        let id: String
        let success: Bool
    }

    enum CodingKeys: String, CodingKey {
        case data
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let dataContainer = try container.decode(DataContainer.self, forKey: .data)
        id = dataContainer.id
        success = dataContainer.success
    }
}

内容的提问来源于stack exchange,提问作者Morozov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:45:04