Swift 4中基于可配置已知Key的JSON解码方案求助
解决Swift中动态Key的JSON解码问题(无需自定义解码逻辑)
嘿,作为Swift新手遇到这种动态Key的解码需求太正常了,而且确实有个巧妙的办法,不用写复杂的自定义init(from decoder:)就能搞定!
核心思路是利用Swift的CodingKey协议自定义一个动态的Key结构体,代替固定的CodingKeys枚举,这样就能在解码前传入我们已知的动态Key了。
步骤1:定义动态CodingKey结构体
首先创建一个遵循CodingKey的结构体,它允许我们传入任意字符串作为Key:
struct DynamicCodingKey: CodingKey { let stringValue: String init?(stringValue: String) { self.stringValue = stringValue } // 我们这里用不到整数Key,所以直接返回nil let intValue: Int? = nil init?(intValue: Int) { return nil } }
步骤2:定义你的数据模型
假设你的动态Key对应的是一个用户对象,先定义好这个对象的模型:
struct User: Decodable { let name: String let age: Int let email: String }
步骤3:执行解码操作
假设你从接口参数中已经拿到了动态Key(比如"user_456"),直接用这个Key来解码即可:
// 示例JSON数据 let jsonString = """ { "user_456": { "name": "Marco", "age": 28, "email": "marco@example.com" } } """ let jsonData = jsonString.data(using: .utf8)! // 从接口参数获取的动态Key let dynamicKey = DynamicCodingKey(stringValue: "user_456")! // 执行解码 do { let decoder = JSONDecoder() // 获取顶层的Keyed容器 let topContainer = try decoder.container(keyedBy: DynamicCodingKey.self) // 用动态Key解码出目标模型 let user = try topContainer.decode(User.self, forKey: dynamicKey) print(user.name) // 输出: Marco } catch { print("解码失败: \(error)") }
为什么这个方法不需要自定义解码逻辑?
我们没有重写任何模型的init(from decoder:)方法,只是利用了JSONDecoder原生的容器解码能力,通过自定义的DynamicCodingKey来指定动态的Key。完全符合你想要的“巧妙声明Decodable结构体和/或CodingKeys”的需求!
如果你的动态Key对应的是数组或者其他类型,只需要把decode(User.self, ...)换成对应的类型(比如decode([User].self, ...))就行,非常灵活。
内容的提问来源于stack exchange,提问作者Marco D.
相关产品推荐
相关产品推荐

