【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内で使用できる辞書型や配列、クラス、構造体に変換するにはJSONSerializationJSONDecoderクラスが使用できますが、より簡単に、短く同じ処理をかけるのが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などが有名です。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index