LoginSignup
14

More than 5 years have passed since last update.

【Swift】JSONのお手軽パース方法【はてな】

Last updated at Posted at 2017-06-17

お手軽にJSONをパースする

今回は株式会社はてなの研修に使用されている(?)教科書の一部を紹介したいと思います。
その教科書のiOSパートで紹介されているリポジトリ内のJSONObject.swiftを修正したものを利用すれば、とてもお手軽にJSONをパースすることができます。

やり方

JSONObject.swiftの用意

JSONObject.swiftに置いてあるコードをそのままコピーしたファイルを自分のプロジェクト内に作成します。
リンク先は僕のリポジトリのファイルですが、これは上記の教科書にあるJSONObject.swiftの内容をSwift4.0でビルドできるように修正したものです。

パースしたいJSONデータのモデルを作成

次のように、受け取るJSONデータに応じてパース結果を保持するデータモデルを作成します。
受け取るJSONデータを提供するAPIのリファレンスなどをよく読み、存在しないかもしれないデータはオプショナル型を採用します。
また、DateFormatter.dateFormatの形式が受け取るJSONデータの日付の形式と合致しているかをしっかり確認しておきましょう。

受け取るJSONデータ
{
    "id": 1,
    "name": "repository-name",
    "private": false,
    "html_url": "https://github.com/MasayaHayashi724/repository-name",
    "description": "This is description."
}
データモデル
struct Repository: JSONDecodable {
    let id: Int
    let name: String
    let isPrivate: Bool
    let htmlURL: URL
    let description: String?

    init(json: JSONObject) throws {
        id = try json.get("id")
        name = try json.get("name")
        isPrivate = try json.get("private")
        htmlURL = try json.get("html_url")
        description = try json.get("description")
    }
}

JSONデータをパースする

APIなどから受け取ったJSONデータを次のようにパースすることができます。

do {
    guard let data = data else { return } // dataはサーバから取得したバイナリデータ
    guard let dic = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { return }
    let jsonObject = JSONObject(json: dic)
    let response = try Repository(json: jsonObject)
    print(response.name)  // 例えばこんな感じで使えます
} catch let error {
    print(error)
}

さいごに

簡単なプロジェクトでのJSONのパースであれば、このミニライブラリで十分です。
紹介したリポジトリの他のコード(APIの利用方法など)もとても参考になるので参考にするといいと思います。
このへんのコードの書き方もいつか紹介できたらと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14