使用Swift 4' Encoder
& Decoder
协议和JSONDecoder
如何使用给定JSON中的密钥初始化Codeable
类型的结构。
即。鉴于下面的JSON,我希望仅使用results
来初始化Example
{
"boolean": true,
"number": 123,
"results": {
"a": "b",
"c": "d",
"e": "f"
},
"string": "Hello World"
}
struct Example: MDB, Codeable{
var a: String
var b: String
var c: String
}
public static func initalize<T: Codable & MDBItem>(json: Data) -> [T]{
var items = [T]()
let decoder = JSONDecoder()
do {
//How do I initialize `T` using a key from the JSON given
//ie. decoder.decode([T].self, from: json["results"])
// Or decoder.decode(["results", [T].self, from: json)
items = try decoder.decode([T].self, from: json)
} catch {
print("error trying to convert data to JSON")
}
return items
}
答案 0 :(得分:2)
一种可能的简单方法是创建一个包装器结构。
所以,你有这个JSON
let json = """
{
"boolean": true,
"number": 123,
"results": {
"a": "b",
"c": "d",
"e": "f"
},
"string": "Hello World"
}
"""
由于您只对定义此结构的"results"
部分感兴趣
struct Example: Codable {
let a: String
let c: String
let e: String
}
现在为了利用Codable
协议(在Swift 4中可用)的强大功能,您可以创建一个这样的包装结构
struct Wrapper: Codable {
let results: Example
}
Wrapper结构的唯一目的是定义从原始JSON的根到您感兴趣的部分的路径。这是
Codable
协议将为您完成剩余的工作。< / p>
现在您可以使用Wrapper结构轻松解码JSON。
if
let data = json.data(using: .utf8),
let wrapper = try? JSONDecoder().decode(Wrapper.self, from: data) {
let results = wrapper.results
print(results)
}
最后,您可以从包装器中提取results
属性。