在动态类型/对象上使用Codable

嗨,我将以下结构嵌套在一个更大的结构中,该结构是通过api调用返回的,但是我无法对这部分进行编码/解码。我遇到的问题是customKey和customValue都是动态的。

{

"current" : "a value"

"hash" : "some value"

"values": {

"customkey": "customValue",

"customKey": "customValue"

}

}

我尝试了类似的操作,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)

以上是 在动态类型/对象上使用Codable 的全部内容, 来源链接: utcz.com/qa/404221.html

回到顶部