はじめに
こんにちは、onukiです。
私はSwiftでJSONを取り扱う際に、
ObjectMapperを使用してるのですが、今回は簡単にObjectMapperの紹介と普通にやると意外と面倒なJSONにネスト配列がある場合の使い方を書いていこうと思います。
準備
今回もおなじみCarthageを使用します。
Cartfileにこちらを記述してください。
1 | github "Hearst-DD/ObjectMapper" ~> 3.1 |
そうしたら、以下のコマンドでビルドしてください。
1 | carthage update --platform iOS |
実装
基本的な使い方
まず、以下のようなJSONを扱う場合、
1 2 3 4 5 | [ { "name": “satou” }, { "name": “suzuki” }, { "name": "takahashi" } ] |
ObjectMapperはMappableプロトコルをモデルクラスに実装し使用します、今回のJSONだと以下のように記述します。
1 2 3 4 5 6 7 8 9 10 | class User: Mappable { var name: String? required init?(_ map: Map) { } func mapping(map: Map) { name <- map["name"] } } |
実際にJSONを読み込みモデルを扱うには以下のようにします
1 2 | let users: [ User ]? = Mapper<User>().mapArray(jsonString) print(users?[0].name) // => Optional("satou") |
JSONの中にnameがなかった場合はuser.nameの値はnilになります。たとえばvar name: String = “”とかやっておけばnilではなく空文字になりますし、var name: String = “Default”など特定の値をデフォルト値にすることもできます。
ネスト配列に対応してみよう
ここからネスト配列が含まれているJSONを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { "id": 1, "name": "user1", "address": "hoge", "photos": [ { "id": 1, "name": "photo1" }, { "id": 2, "name": "photo2" } ] } |
Mappableプロトコルを今回はネスト配列に対応するために2つ作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | struct User: Mappable { var id = 0 var name = "" var address = "" var photos: [Photo] = [] init?(map: Map){} mutating func mapping(map: Map) { id <- map["id"] name <- map["name"] address <- map["address"] photos <- map["photos"] } } struct Photo: Mappable { var id = 0 var name = "" init?(map: Map){} mutating func mapping(map: Map) { id <- map["id"] name <- map["name"] } } |
JSONからモデルに変換しuserのphotos配列から0番目のデータを取得したい際にはこのように取得します。
1 2 3 | let user: User = Mapper().map(JSONString: jsonString)! print(user.name) // => "user1" let photo: Photo = user.photos[0] |
さいごに
ObjectMapperいかがだったでしょうか、モデルクラスの書き方もわかりやすく個人的には気に入っているので引き続き使っていきたいと思っています。