LoginSignup
7
8

More than 3 years have passed since last update.

【Swift】構造体とJSONの変換方法(JSONEcoder,decoder)

Last updated at Posted at 2019-09-29

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

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8