【Swift】SwiftyJSONの使い方!APIをパース→キャストで便利に
この記事からわかること
- Swiftのライブラリ:SwiftyJSONの使い方
- APIで取得できるJSON形式のデータを変換する方法
- キャスト(型変換)できるデータ型
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
APIで取得できるJSON形式とは?
さまざまなサービスがサービス内の情報を外部のサービスから参照できるようにAPIとして提供しています。
※APIとは「Application Programming Interface」の略称でアプリやプログラム、Webサービス同士を繋ぐインターフェースのことを指します。
APIで取得できるのはJSON形式と呼ばれる以下のようなjavascriptのオブジェクトの記法に則った形式になっていることが多いです。
{
"person": [{
"name": "Yoshida Takashi",
"age": 21,
"hobby": ["読書", "ランニング", "テニス"]
},
{
"name": "Amemiya Tsubaki",
"age": 18,
"hobby": ["旅行", "料理", { "web制作": ["HTML", "CSS", "php"] }]
}
]
}
上記のような簡素なネスト(深さ)なら良いですが、APIによっては複雑でより深いものもあるのでSwift内での扱いは大変になります。
SwiftyJSONとは?
SwiftyJSONとはJSON形式のデータをパースしてSwift内で操作しやすい形に変換する機能を提供してくれるSwiftのライブラリの1つです。デフォルトでは組み込まれていないのでCocoa Podsなどのライブラリ管理ツールを使用してプロジェクトに導入する必要があります。
SwiftでJSON形式をSwift内で使用できる辞書型や配列、クラス、構造体に変換するにはJSONSerialization
やJSONDecoder
クラスが使用できますが、より簡単に、短く同じ処理をかけるのがSwiftyJSONです。
インストール方法
プロジェクトに導入するためには今回はCocoa Podsを使用します。(別にそれ以外のライブラリ管理ツールでも良いです)
「PodFile」にpod 'SwiftyJSON'
と記述しpod install
を実行します。
pod 'SwiftyJSON'
あとは使用するファイルの上部でimport
すれば準備は完了です。
import SwiftyJSON
JSONDecoderを使用したAPI取得処理例
まずはざっくりSwiftyJSONを使用せずにSwift内で扱いやすいように構造体に変換する方法を見てみます。今回はQiitaのAPIを使用して記事を取得していきます。まずは記事用の構造体を定義します。プロパティは取得できるJSONデータを読み解きながら同名で定義する必要があり、ネストするほどたくさんのモデルが必要になります。この作業がJSONが大きいほど大変になります。
struct User : Decodable{
let id:String
let name:String
}
struct Article : Decodable{
let id:String
let title:String
let user:User
}
続いて実際の通信処理&変換部分です。ここはもうスムーズに書けます。
func getArticles(){
let url = URL(string: "https://qiita.com/api/v2/items")!
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
do {
let decoder = JSONDecoder()
let articles = try! decoder.decode([Article].self, from: data!)
print(articles[0].user.name)
} catch {
print(error.localizedDescription)
}
}.resume()
}
またもう1つのJSONSerialization
クラスの場合はモデルの定義はなく辞書型に変換できますが、中身を取り出す際に以下のような深いネストとキャストの連続になってしまいます。
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [Any]
if let article = json![0] as? [String: Any] {
if let user = article["user"] as? [String: Any] {
if let name = user["name"] as? String {
print(name)
}
}
}
SwiftyJSONを使用したAPI取得処理例
次にSwiftyJSONを使用したAPI取得処理例を見てみます。
URLSession.shared.dataTask(with: request) { data, response, error in
do {
let json = try? JSON(data: data!)
print(json![0]["user"]["name"].string)
} catch {
print(error.localizedDescription)
}
}.resume()
めちゃくちゃスッキリしました。JSONのパース(解析)をしているのはJSON
構造体のイニシャライザを使用している以下の部分です。
let json = try? JSON(data: data!)
これにより掘り進めていくときのキャストが不要になり、json![0]["user"]["name"]
のようにキーなどがわかっていれば一発で記述することができます。
豊富なキャスト
またJSON
構造体には簡単に型変換(キャスト)できるようなプロパティが用意されています。
print(json![0]["user"]["items_count"].double)
変換できる型は非常に多くInt
型もInt8 〜 64
まで定義されています。
プロパティ名 | 型 |
---|---|
string | String |
int | Int |
double | Double |
bool | Bool |
array | Array |
arrayValue | Array<JSON> |
etc... | etc... |
AndroidならGSONなどが有名です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。