お手軽に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の利用方法など)もとても参考になるので参考にするといいと思います。
このへんのコードの書き方もいつか紹介できたらと思います。