Codable,只能从字典中解码值
问题描述:
我有一个API的json响应。这将返回一个也是一个Dictionary的值。如何才能实现仅存储/映射此字典的值。这里是一个可以简单地放入一个游乐场的例子:Codable,只能从字典中解码值
id = ["$oid": "591ae6cb9d1fa2b6e47edc33"]
只应
id = "591ae6cb9d1fa2b6e47edc33"
这里是一个可以简单地放入一个游乐场的例子:
import Foundation
struct Location : Decodable {
enum CodingKeys : String, CodingKey {
case id = "_id"
}
var id : [String:String]? // this should be only a string with the value of "$oid"
}
extension Location {
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decode([String:String]?.self, forKey: .id)
}
}
var json = """
[
{
"_id": {
"$oid": "591ae6cb9d1fa2b6e47edc33"
}
},
{
"_id": {
"$oid": "591ae6cd9d1fa2b6e47edc34"
}
}
]
""".replacingOccurrences(of: "}\n{", with: "}\\n{").data(using: .utf8)!
let decoder = JSONDecoder()
do {
let locations = try decoder.decode([Location].self, from: json)
locations.forEach { print($0) }
} catch {
print(error.localizedDescription)
}
答
你几乎在那里:
struct Location {
var id: String
}
extension Location: Decodable {
private enum CodingKeys: String, CodingKey {
case id = "_id"
}
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let _id = try values.decode([String: String].self, forKey: .id)
id = _id["$oid"]!
}
}
如果您在JSON数据中有_id
下的mote键,我强烈建议您创建一个私有结构体来代表类型安全性的结构。