Edited at

Swift4 CodableでJSONが扱いやすくなる?

More than 1 year has passed since last update.


はじめに

Codableを利用するとJSONが扱いやすくなるようなので、

試してみました。

もうSwiftyJSONやObjectMapperなどのライブラリも不要になりそうです。


試してみる


1. JSONデータを用意する


テストデータ(JSON)

{

"dateString":"2017-06-08 14:43:28 +0000",
"weeks":[
"sunny",
"sunny",
"cloudy",
"cloudy",
"cloudy",
"rainy",
"snowy"
        ]
}


2. 構造体を定義する

構造体にCodableを実装する


Forecast.swift

struct Forecast: Codable {

enum WeatherType: String, Codable {
case sunny, cloudy, rainy, snowy
}

var dateString = ""
var weeks: [WeatherType]
}



3. JSONをパースする

decodeの第一引数にデータ型を指定すると、ドットでアクセスできるようになります。

簡単ですね。


デコードする


if let path = Bundle.main.path(forResource: "forecast", ofType: "json") {

let jsonData = try! Data(contentsOf: URL(fileURLWithPath: path))

let jsonDecoder = JSONDecoder()
let forecast = try! jsonDecoder.decode(Forecast.self, from: jsonData)

//ドットでアクセスできる
print(forecast.dateString)

_ = forecast.weeks.map {
print($0)
}
}



出力結果

2017-06-08 14:43:28 +0000

sunny
sunny
cloudy
cloudy
cloudy
rainy
snowy


[おまけ] JSONのエンコードのサンプル

    let forecast = Forecast(dateString: Date().description,

weeks: [.sunny, .sunny, .cloudy, .rainy, .snowy])
let jsonEncoder = JSONEncoder()
let jsonData = try! jsonEncoder.encode(forecast)
let jsonString = String(data: jsonData, encoding: .utf8)
print(jsonString ?? "unwap json")

/// {"weeks":["sunny","sunny","cloudy","rainy","snowy"],"dateString":"2017-06-08 15:11:21 +0000"}