Codable, Decodable 只是字典中的一个值
Codable, Decodable only a value out of Dictionary
我有一个 API 的 json 响应。这 returns 也是一个值,它是一个字典。我如何才能实现仅存储/映射此字典的值。这是一个可以简单地放在操场上的例子:
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([=12=]) }
} 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 键,我强烈建议您创建一个私有结构来表示该结构,以确保类型安全。
我有一个 API 的 json 响应。这 returns 也是一个值,它是一个字典。我如何才能实现仅存储/映射此字典的值。这是一个可以简单地放在操场上的例子:
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([=12=]) }
} 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 键,我强烈建议您创建一个私有结构来表示该结构,以确保类型安全。