カテゴリー: iOS

[Swift]ObjectMapperで簡単にJSONを読み込む

はじめに

こんにちは、onukiです。

私はSwiftでJSONを取り扱う際に、
ObjectMapperを使用してるのですが、今回は簡単にObjectMapperの紹介と普通にやると意外と面倒なJSONにネスト配列がある場合の使い方を書いていこうと思います。

準備

今回もおなじみCarthageを使用します。
Cartfileにこちらを記述してください。

github "Hearst-DD/ObjectMapper" ~> 3.1

そうしたら、以下のコマンドでビルドしてください。

carthage update --platform iOS

 

実装

基本的な使い方

まず、以下のようなJSONを扱う場合、

[
    { "name": “satou” },
    { "name": “suzuki” },
    { "name": "takahashi" }
]

ObjectMapperはMappableプロトコルをモデルクラスに実装し使用します、今回のJSONだと以下のように記述します。

class User: Mappable {
    var name: String?

    required init?(_ map: Map) {
    }

    func mapping(map: Map) {
        name <- map["name"]
    }
}

実際にJSONを読み込みモデルを扱うには以下のようにします

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を使用します。

{
    "id": 1,
    "name": "user1",
    "address": "hoge",
    "photos": [
        {
            "id": 1,
            "name": "photo1"
        },
        {
            "id": 2,
            "name": "photo2"
        }
    ]
}

Mappableプロトコルを今回はネスト配列に対応するために2つ作成します。

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番目のデータを取得したい際にはこのように取得します。

let user: User = Mapper().map(JSONString: jsonString)!
print(user.name) // => "user1"
let photo: Photo = user.photos[0]

 

さいごに

ObjectMapperいかがだったでしょうか、モデルクラスの書き方もわかりやすく個人的には気に入っているので引き続き使っていきたいと思っています。

nukky

シェア
執筆者:
nukky
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前