Swift 4 のEncoder
&Decoder
プロトコルを使用し、特定の JSON のキーを使用してJSONDecoder
タイプの構造体を初期化する方法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
}
考えられる簡単な方法は、ラッパー構造体を作成することです。
それで、あなたはこの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
プロトコルが残りのジョブを実行するためでした。
これで、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
、ラッパーからプロパティを抽出できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加