【Swift】JSONを扱う
目次
SwiftでJSONを扱うには
Foundation
に含まれているJSONSerialization
を使用するFoundation
に含まれているCodeble
を使用する
JSONSerializationを使用する方法
シリアライズ
サンプルコード
1 |
|
解説
JSONに変換するための
Dictionary型
を準備する1
let jsonDic:[String : Any] = ["id":1,"name":"daiki iijima","mail":"daiki@example.com"]
変換したデータを
JSONSerialization.data()
でシリアライズする1
let jsonData = try! JSONSerialization.data(withJSONObject: jsonDic)
Data型
を文字列に変換する(任意)1
let jsonStr=String(data: json, encoding: .utf8)!
デシリアライズ
サンプルコード
1 |
|
解説
JSON文字列を用意する
1
let jsonStr: String = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"
JSON文字列を
Data型
に変換するデータは、JSON仕様でサポートされている5つのエンコーディングのいずれかでなければなりません。utf-8、utf-16le、utf-16be、utf-32le、utf-32be。データは、BOM を持っていてもいなくてもかまいません。解析に使用する最も効率的なエンコーディングは UTF-8 なので、このメソッドに渡すデータのエンコーディングを選択できる場合は、UTF-8 を使用してください。
1
let jsonData = jsonStr.data(using: String.Encoding.utf8)!
変換したデータを
指定のDictionary型
に変換する1
let jsonDic = try! JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String,Any>
Dictionary型の呼び出し方で呼び出して使用する
変換後はOptional型1
2
3print(jsonDic["id"]!)
print(jsonDic["name"]!)
print(jsonDic["mail"]!)
Codebleを使用する方法
Codebleは、構造体をData型として扱えるようにするためのProtcol
以下の構造体はこのあとのシリアライズ
、デシリアライズ
処理で使用するCodebleを実装した構造体です。
1 |
|
シリアライズ
サンプルコード
1 |
|
解説
データを入れる構造体
を用意して、パースした値をいれていく1
let user = User(id: 1, name: "daiki iijima", mail: "daiki@example.com")
JSONEncoder
を使用して構造体をJSON(Data型)にシリアライズする
この変換で返ってくる値は、Data型
1
2let encoder = JSONEncoder()
let jsonData: Data = try! encoder.encode(user)Data型
を文字列に変換する(任意)1
let jsonStr=String(data: jsonData, encoding: .utf8)! // String型に変換したい場合
デシリアライズ
サンプルコード
1 |
|
解説
JSON文字列を用意する
1
let jsonStr = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"
JSON文字列を
Data型
に変換するデータは、JSON仕様でサポートされている5つのエンコーディングのいずれかでなければなりません。utf-8、utf-16le、utf-16be、utf-32le、utf-32be。データは、BOM を持っていてもいなくてもかまいません。解析に使用する最も効率的なエンコーディングは UTF-8 なので、このメソッドに渡すデータのエンコーディングを選択できる場合は、UTF-8 を使用してください。
1
let jsonData = jsonStr.data(using: .utf8)!
JSONDecoder
を使用してData型をデシリアライズする1
2let decoder = JSONDecoder()
let user:User = try! decoder.decode(User.self, from: jsonData)構造体のプロパティを呼び出すことでデータにアクセスできる
1
2
3print(user.id)
print(user.name)
print(user.mail)
どちらを使えばいいのか
特別な理由がない限り、Codeble
を使用した方法のほうが取り扱いがしやすいと思います。
参考
JSONパース関係
- https://www.sejuku.net/blog/34776
- https://qiita.com/s_emoto/items/deda5abcb0adc2217e86
- https://qiita.com/riku333/items/720056f335ba30cbb8e2
- https://dev.classmethod.jp/articles/swift3-json/
- https://www.egao-inc.co.jp/programming/swift_codable/
データ型について
【Swift】JSONを扱う