嗨,我将以下结构嵌套在一个更大的结构中,该结构是通过api调用返回的,但是我无法对这部分进行编码/解码。我遇到的问题是customKey和customValue都是动态的。
{ "current" : "a value" "hash" : "some value" "values": { "customkey": "customValue", "customKey": "customValue" } }
我尝试了类似的操作,var values: [String:String]但是显然不起作用,因为它实际上不是的数组[String:String]。
var values: [String:String]
[String:String]
由于您将我的答案链接到另一个问题,因此我将扩展该问题以回答您的问题。
事实是,如果您知道要查找的位置,那么所有键在运行时都是已知的:
struct GenericCodingKeys: CodingKey { var intValue: Int? var stringValue: String init?(intValue: Int) { self.intValue = intValue; self.stringValue = "\(intValue)" } init?(stringValue: String) { self.stringValue = stringValue } static func makeKey(name: String) -> GenericCodingKeys { return GenericCodingKeys(stringValue: name)! } } struct MyModel: Decodable { var current: String var hash: String var values: [String: String] private enum CodingKeys: String, CodingKey { case current case hash case values } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) current = try container.decode(String.self, forKey: .current) hash = try container.decode(String.self, forKey: .hash) values = [String: String]() let subContainer = try container.nestedContainer(keyedBy: GenericCodingKeys.self, forKey: .values) for key in subContainer.allKeys { values[key.stringValue] = try subContainer.decode(String.self, forKey: key) } } }
用法:
let jsonData = """ { "current": "a value", "hash": "a value", "values": { "key1": "customValue", "key2": "customValue" } } """.data(using: .utf8)! let model = try JSONDecoder().decode(MyModel.self, from: jsonData)