【Swift】JSONをデコードする方法

この記事では以下の方法をご紹介します。

  1. ネットからjsonを取得する
  2. 取得したjsonをデコードして構造体に格納する

以下のバージョンで動作確認をしています。

  • Swift 5.2
  • iOS13.4

JSONを取得する

NEWS APIと言うサイトがあります。

https://newsapi.org/

ニュース記事をjson形式で配信しているサイトです。

上記のサイトに登録するとAPIキーがもらえます。

APIキーを指定してAPIを叩くとjsonが表示されますが、見にくいので以下のサイトでフォーマットしましょう。

https://jsonformatter.curiousconcept.com/

うまくいくと以下のようなレスポンスが返ってくるはずです。

{
   "status":"ok",
   "totalResults":70,
   "articles":[
      {
         "source":{
            "id":null,
            "name":"Gizmodo.jp"
         },
         "author":"そうこ",
         "title":"Android11ベータ版リリース&オンライン発表会が延期。「今は祝っている場合じゃない」 - ギズモード・ジャパン",
         "description":"Googleが、今月3日に予定されていたAndroid 11ベータ版リリースとその発表会を延期することを明らかにしました。新型コロナ感染拡大防止のため今年のGoogle I/Oは中止、オンラインでAndoird 11ベータ版発表イベントが開催されるはずでした。発表イベント延期の理由は「今は(Android 11発表を)お祝いしている時ではない」から。 Android 11の詳細発表を楽しみにして",
         "url":"https://www.gizmodo.jp/2020/06/android-11-reschedule.html",
         "urlToImage":"https://assets.media-platform.com/gizmodo/dist/images/2020/06/01/200601android11beta-w960.jpg",
         "publishedAt":"2020-06-01T04:30:00Z",
         "content":"Google3Android 11\r\nGoogle I/OAndoird 11Android 11\r\nWe are excited to tell you more about Android 11, but now is not the time to celebrate. We are postponing the June 3rd event and beta release. We'll… [+208 chars]"
      }

「”key”:”value”」の形でデータが羅列されています。

キーの名前は後で使うので覚えておきます。

Swiftでコードを書く

次にSwiftのコードで上記のデータを取得して格納できるようにします。

まずはデータを格納するための構造体を用意します。

Codableプロトコルを指定して、jsonの項目名と構造体の変数名を同じ名前にすると、jsonを変換したときに一括して変数にデータを格納することができます。

struct Article: Codable{
    let title: String?
    let description: String?
    let url: String?
}

struct ResultJson: Codable{
    let articles:[Article]?
}

構造体名は適当で良いですが、構造体内の変数名は適当ではダメでjsonのキーの名前と一致していないといけません。

1つの記事の「title」「description」「url」をArticleクラスとして作っています。

記事は1つだけではないので、ResultJsonクラスの中にArticleの配列を作っています。

「articles」と言う変数名もjsonのキーと一致していることに注意してください。

それではデータを取得して格納するまでのコードを見ていきましょう。

func download(){

        let urlString = "https://newsapi.org/v2/top-headlines?country=jp&category=technology&apiKey=9947436f9ee74ff2a49a3c7b8f60226e"
        let req_url = URL(string: urlString)
        let req = URLRequest(url: req_url!)
        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)

        let task = session.dataTask(with: req, completionHandler: {
           (data, response, error) in
           
           session.finishTasksAndInvalidate()
           
           do{
               let decode = JSONDecoder()
               let json = try decode.decode(ResultJson.self, from: data!)
               
               print(json)
           }catch{
               print("error happened")
           }
        })

        task.resume()
    }

大まかなコードの流れとしては以下の通り。

  1. 文字列をURLに変換
  2. URLをURLRequestに変換
  3. URLSessionでセッションを作って、dataTaskでURLにアクセスする
  4. URLにアクセスが完了すると、completionHandlerの中身が実行される。(クロージャ)
  5. セッションを終了しjsonをデコードして構造体に格納する
  6. デコードに成功すれば内容を表示、失敗したらエラーであることを表示する

実際の処理はtask.resumeで開始されます。

以上です。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog