背景
JSONを返してくるWebAPIのデータをSwiftでいい感じに利用したい
alamofire
(REST用?)とSwiftyJSON
(JSONまわり?)いう有名なライブラリはあるらしいのですが、
Swift4ではそれらを使わなくてもCodable
という標準ライブラリで容易にできるということなので、試してみました。
実装例
1. 構造体を作る
下記のようなJSONを受け取ると仮定して、
{
"id":1,
"name":"\u673a\u306e\u4e0b"
}
送られてくるJSONに則した構造体を定義する。
struct JsonSample : Codable{
var id : Int
var name : String
}
2. WebAPIを叩く&JSONをコンバートする
※例はGET
POSTは下記あたりを参照?
https://qiita.com/yutailang0119/items/ab400cb7158295a9c171
let listUrl = "https://xxxxxxxxx.com/?aaa=bbb"
guard let url = URL(string: listUrl) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!.localizedDescription)
}
guard let data = data else { return }
let json = try? JSONDecoder().decode(JsonSample.self, from: data)
}.resume()
URLSession
を用いてサーバーからデータを取得。
取得したデータはJSONDecoder
を用いて、1.で生成したクラスに変換する。
3. 受け取ったデータを使用する print(json.name)
print(json.name)
普通に構造体にアクセスすれば使えます
おまけ 配列に変換する{
"id":1,
"name":"\u673a\u306e\u4e0b"
},
{
"id":2,
"place":"\u7384\u95a2",
}
{
"id":1,
"name":"\u673a\u306e\u4e0b"
},
{
"id":2,
"place":"\u7384\u95a2",
}
こんな感じでJSONたちがたくさん送られてくる場合は、let json = try? JSONDecoder().decode(JsonSample.self, from: data)
の部分を下記のように変更する
let json = try? JSONDecoder().decode([JsonSample].self, from: data)
作った構造名を[]
(配列の意)で囲むだけ。
使うときは、「構造体の配列を使用する」ときの使い方で…(まるなげ!)
かんたんー。
コメント