[iOS] Alamofire と Codable でAPIをパースする

環境

  1. MacOS Catalina バージョン10.15.5
  2. Xcode11.6
  3. Swift 5.2.4

Alamofire をインストール

Swift Package Manager でインストールしてみます。
Qiita に iOSアプリ開発にSwift Package Managerを使おう という記事があるので、その通りに進めます。

パッケージのリポジトリのURLは https://github.com/Alamofire/Alamofire を入力します。

一瞬でインストールできました!

一旦適当なJSON APIを叩いて適当にオブジェクトを取得する

以下のような最低限のコードを書くだけでHTTP通信をしてレスポンスを取得できます。
ちなみにAlamofire の クラス名はAFです。
JSON のサンプルとして https://jsonplaceholder.typicode.com/todos/1 のURLを使っています。

        AF.request("https://jsonplaceholder.typicode.com/todos/1").response{ response in
            guard let data = response.data else {
                return
            }
            
            let jsonObject = try? JSONSerialization.jsonObject(with: data, options:.allowFragments) as? [String: Any]
            
            print(response.response?.allHeaderFields)  // レスポンスヘッダ
            print("=====================================")
            print(jsonObject)    // レスポンスボディ
        }

レスポンスヘッダとレスポンスボディがプリントされると思います。
JSONのスキーマを特に予想していないため、JSONSerialization を使ってJSONオブジェクトに変換しています。

Codable を使ってJSONオブジェクトを取得する

シンプルなDicationary型の構造の場合

上記JSONのレスポンスボディは以下です。

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

それをもとに、Codable に準拠した構造体を作ります。
適当なところに下記を定義します。

struct Todo: Decodable {
    var userId: Int
    var id: Int
    var title: String
    var completed: Bool
}

JSONのキーとstruct のプロパティ名、型を一致させます。
プロパティ名は大文字・小文字も厳密にJSONのキー名に一致させます。
(構造体の名前については適当です。
JSONのURLがtodos というパスだったので、適当にTodo という名前にしてます)

以下のようなコードで期待するJSONオブジェクトを取得できます。

        AF.request("https://jsonplaceholder.typicode.com/todos/1")   { urlRequest in
            urlRequest.timeoutInterval = 5
            urlRequest.allowsConstrainedNetworkAccess = false
        }
        .response{ response in
            guard let data = response.data else {
                return
            }
            
            let jsonObject = try? JSONDecoder.init().decode(Todo.self, from: data)
            print(jsonObject)    // レスポンスボディ
        }

レスポンスボディがプリントされたと思います!
定義したJSONのスキーマ採用するので、JSONDecodable を使ってスキーマ に沿ったオブジェクトに変換しています。

JSONDecodable: スキーマを予測できる場合、スキーマ に沿ったオブジェクトを生成する
JSONSerialization: スキーマを予測できない場合、とりあえずJSONオブジェクトを生成する

配列型の場合

以下のような配列型の場合

[
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  {
    "userId": 1,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": false
  }
]

以下のように、配列を指定してDecode すれば、オブジェクトの配列に変換できます!

 let jsonObject = try? JSONDecoder.init().decode([Todo].self, from: data)

最後に

以上です。お疲れ様でした!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。