以前、Unityで同じようなことをやったのですが、今度は、Xcode(Swift)での話です。
CocoaPodsでObjectMapperを組み込む
現在、Xcode 8.2.1 + Swift3の環境です(2017.7)。
pod 'ObjectMapper', '~> 2.2'
正しくインストールされると、import ObjectMapper も認識され使えるようになります。
例として、Google Places API Web Service で取得したPlacesの結果JSONをXcodeへ読み込んでマップしてみようと思います。JSONは以下のような感じになります。JSON Editor Online では、JSONをオブジェクトのツリー構造で表示してくれるので、マップする際に見やすくて便利です。
第一階層の results にPlacesの結果が配列になっている状態です。このJSONの中から必要な情報だけをマップしてみます。
クラスを用意して、JSONデータをマップする
第一階層からは、status と results を取り出し、results は、 Result クラスの配列になるようにしておきます。Result クラスでは、それ以下にある、id 、name 、place_id を取り出し、さらにネストされている geometry.location.lat と geometry.location.lat も同じプロパティとして扱おうと思います。lat や lng は実際のJSONの階層とは異なる状態となっている感じです。マップするために使うクラス定義は、GooglePlacesMappableClassBox.swift に以下のような感じで詰め込んでおきました。
import UIKit
import ObjectMapper
class GooglePlacesMappableClassBox: NSObject {
}
class Result: Mappable {
var id: String?
var name: String?
var place_id: String?
var lat:Double?
var lng:Double?
required init?(map: Map) {
}
func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
place_id <- map["place_id"]
lat <- map["geometry.location.lat"]
lng <- map["geometry.location.lng"]
}
}
class JSONObj: Mappable {
var status:String?
var results:Array<Result>?
required init?(map: Map) {
}
func mapping(map: Map) {
status <- map["status"]
results <- map["results"]
}
}
実際にJSONを読み込んで(読み込み自体の記述は省略します。読み込んだJSON文字列は「jsonStr」に入っているとします)、「import ObjectMapper」しているコードで
let jsonobj = Mapper<JSONObj>().map(JSONString: jsonStr)
します。すると、jsonobj?.status に「OK」のような文字列が入り、jsonobj?.results が Result オブジェクトの配列になっていることが確認できると思います。jsonobj?.results?[0].lat を見てみると最初のオブジェクトの lat の値が入っているはずです。他にも必要なプロパティがあったら、Result クラスでメンバ変数を作り、 mapping 関数で他のと同様に代入してあげれば取得できます。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、Unity, Unity Netcode for GameObjects, CakePHP, Laravel, ZBrush, Modo, Adobe Substance 3D, Adobe Firefly, Xcode, Apple Vision Pro, Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。