はじめに
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"}