【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
2
3
4
5
6struct User: Codable
{
var id : Int
var name : String
var mail : String
}
シリアライズ
サンプルコード
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/
データ型について




