【Swift】API(JSON形式)を構造体や辞書型へ変換!JSONSerialization

この記事からわかること
- SwiftでAPI(JSON)を構造体や辞書型へ変換する方法
- JSONSerializationやURLSessionのdataTaskメソッドの使用方法
- 暦APIの導入方法
- 天気予報API(livedoor天気互換)方法
index
[open]
\ アプリをリリースしました /
Swiftで開発しているアプリケーションにAPIを導入して外部からデータを参照する方法をまとめていきます。
APIとは?
そもそもAPIとは「Application Programming Interface」の略称でアプリやプログラム、Webサービス同士を繋ぐインターフェースのことを指します。
サービス同士を繋ぐ形で提供されているものはAPIと呼ばれますが今回はWeb上からJSON形式でデータを受け取り、アプリ内で参照するために使用するようなAPIを使用していきます。
今回使用するのは以下2つのAPIです。
- 暦API:日付情報を提供
- 天気予報API:天気予報を提供
その前にAPIを使用してデータを取得するために必要となる2つのポイントを見ておきます。
- URLSession.shared.dataTask:HTTPリクエストを送信
- JSONSerialization:JSONデータを操作するクラス
URLSession.shared.dataTask
公式リファレンス:URLSession.shared.dataTask
SwiftからHTTPリクエストを送信するにはURLSession.shared.dataTask
を使います。
おすすめ記事:【Swift】URLSessionクラスとは?URLRequestとHTTP通信!
引数に対象のURLを渡すとその結果がcompletionHandler
で受け取れます。1つ目にはサーバーから返されたデータが、2つ目にはHTTPヘッダーやステータスコードなどが、3つ目にはリクエスト失敗時の理由などを受け取れます。
URLリクエストを構築する前にURLの有効性をチェックしておきます。ここでは独自のメソッドvalidationUrl
を定義しています。詳細は下記記事を参考にしてください。
おすすめ記事:【SwiftUI】入力されたURLの有効性を識別する方法!
JSONSerialization
JSONSerialization
クラスはSwiftでJSON形式のデータを操作する際に使用するクラスです。使用するにはFoundation
をimport
しておく必要があります。
このクラスを使用することでJSONと辞書型の相互変換を行うことができます。JSONデータへと変換するにはjsonObject
メソッドを使用します。
変換されて返ってくるのはAny
型のデータなので任意の方にキャストしておくと便利です。
またライブラリを使用するともっと簡単にJSONを操作することができるようになります。
暦APIの導入方法
まずは日付情報を取得できる「暦API」をSwiftアプリに組み込んで行きます。
暦APIではパラメータによって取得するデータを指定する必要があるためphpを介してJSONデータを取得し表示させるようにしました。少しイレギュラーな実装方法になっています。(最善策があれば教えてください)
実装の流れ
- phpでパラメータを指定しAPIデータを取得→別URLへ出力
- HTTPリクエスト送信→データ(JSON文字列)を取得
- 辞書型に変換
- データを表示
取得できるJSONデータ
phpからパラメータを指定しAPIデータを取得
ここはSwiftではなくphpでの記述になります。私の場合はこのサイトを運営しているので「https://appdev-room.com/rokuyou」にアクセスした際に必要なパラメータを渡し済みの暦APIデータを出力するようにしています。
これで先ほどのURLにアクセスすると当日を中心にした1年間の暦情報を持ったJSONデータを取得できます。これを今度はSwift側で操作していきます。
PHPやcURLの使い方に関しては下記記事を参考にしてください。
HTTPリクエスト送信→データ(JSON文字列)を取得
Swift側ではデータを取得するためのクラス(fetchDateInfoAPI)を用意しておきます。HTTPリクエストを送信してデータを取得後にcompletionHandler
を使用して辞書型に変換したデータにアクセスできるメソッドを定義していきます。
まずはAPIを取得するためのリクエストURLからJSONデータを取得する処置を記述します。URLが有効かどうかを識別し問題なければリクエストを構築してdataTask
メソッドを呼び出します。
辞書型に変換
Swiftで扱えるようにJSONデータを変換するにはJSONSerialization
でできました。返り値はAny
型だったので辞書型に変換するためas? [String: Any]
を後ろにつけてキャストしておきます。
これで正常に変換できればdic
の中に辞書型で保持されたデータが入ります。.keys
メソッドなどでキーとなっている文字列を見てみるとわかりやすいです。
暦APIではキーdatelist
の中に日付をキーとして日付情報を保持しているのでdic!["datelist"]
と決め打ちして中身を取得しています。
あとはこのメソッドを任意の場所で呼び出してプロパティなどに格納しておけば自由にアクセスすることができるようになります。
呼び出し使用例
全体のコード
天気予報APIの導入方法
「天気予報API」をSwiftアプリに組み込んで行きます。
- 公式HP:https://weather.tsukumijima.net/
- API URL:https://weather.tsukumijima.net/api/forecast/city/130010
こちらはクエストURL末尾に任意のエリアコードを渡すことでその地域の天気予報を3日分JSONデータで取得することができます。なのでPHPは介さずにアクセスしますが、取得できるJSONはやや複雑な構造をしています。
取得できるJSONデータ
実装のコード
今回取得したい情報は天気予報部分(forecasts
)の中です。辞書型でforecasts
までアクセスしたらその中は配列形式で天気情報を保持しているのでas? Array<Any>
で配列型にキャストする必要があります。
またdescription
のbodyText
の中に\n
を含んでいたのが原因でJSONデータを辞書型に変換できなかったので一度文字列に変換後、改行文字を置換し再度データ型にしてから辞書型にキャストしています。
今回のAPIを実際に導入したiOSアプリを公開しています。ソースコードもGitHub上に公開しているので興味があれば覗いてみてください。
GitHub:Kiroku-Calendarまだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。