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
相关产品推荐
相关产品推荐

