API通信する際に構造体をJSONに変換してリクエストしたりまた逆に、APIから受け取ったJSONのレスポンスを構造体に変換したい時があります。
そこで、今回はJSONDecoer,JSONEncoderを用いて構造体とJSONの変換方法を備忘録として記載します。(Qiita初投稿なので、緊張してます)
バーション
Xcode10.2.1、Swift5.0.1
JSONEncoder(構造体→JSON)
// Human構造体
struct Human:Codable {
var id: Int
var name: String
var hobby: String
}
// Humanのインスタンス生成
let hogeMan1 = Human(id: 1, name: "ほげ君", hobby: "プログラミング")
print(hogeMan1)
// -> "Human(id: 1, name: "ほげ君", hobby: "プログラミング")"
// JSONEcoder(構造体→JSON[Data型])
let hogeManJsonData = try! JSONEncoder().encode(hogeMan1)
print(hogeManJsonData)
// -> "59 bytes"
// Data型→String型にキャスト
let hogeManJsonString = String(data: hogeManJsonData, encoding: .utf8)!
print(hogeManJsonString)
// -> "{"id":1,"name":"ほげ君","hobby":"プログラミング"}"
ポイント
- EncodeとDecodeを行うため、構造体に
Codeble
を継承する - JSONEncoderの
戻り値はData型
なので、必要に応じてString型にキャストする
Codable = Encodable + Decodable
引用:【Swift】Codableについて備忘録
JSONDecoder(JSON→構造体)
// JSON[String型]定義
let jsonString = "{\"id\":2,\"name\":\"ほげほげ君\",\"hobby\":\"ボルダリング\"}"
// String型→Data型にキャスト
let jsonData = jsonString.data(using: .utf8)!
print(jsonData)
// -> "62 bytes"
// JSONDecoder(JSON→構造体)
let hogeMan2 = try! JSONDecoder().decode(Human.self, from: jsonData)
print(hogeMan2)
// -> "Human(id: 1, name: "ほげ君", hobby: "プログラミング")"
ポイント
- JSONDecoderの
引数はData型
なので、String型のJSONはData型にキャストする必要がある
まとめ
上記で紹介したコードのまとめです。
import UIKit
// Human構造体
struct Human:Codable {
var id: Int
var name: String
var hobby: String
}
// JSONEncoder--------------------------------------------------
// Humanのインスタンス生成
let hogeMan1 = Human(id: 1, name: "ほげ君", hobby: "プログラミング")
print(hogeMan1)
// JSONEcoder(構造体→JSON[Data型])
let hogeManJsonData = try! JSONEncoder().encode(hogeMan1)
print(hogeManJsonData)
// Data型→String型にキャスト
let hogeManJsonString = String(data: hogeManJsonData, encoding: .utf8)!
print(hogeManJsonString)
// JSONDecoder--------------------------------------------------
// JSON[String型]定義
let jsonString = "{\"id\":2,\"name\":\"ほげほげ君\",\"hobby\":\"ボルダリング\"}"
// String型→Data型にキャスト
let jsonData = jsonString.data(using: .utf8)!
// JSONDecoder(JSON→構造体)
let hogeMan2 = try! JSONDecoder().decode(Human.self, from: jsonData)
print(hogeMan2)
以上になります。
もし不明点や間違い等があればコメントくださいm(_ _)m