【Swift】JSONを扱う

目次

SwiftでJSONを扱うには

  1. Foundationに含まれているJSONSerializationを使用する
  2. Foundationに含まれているCodebleを使用する

JSONSerializationを使用する方法

シリアライズ

サンプルコード

1
2
3
4
5
6
7
8
//  シリアライズ
let jsonDic:[String : Any] = ["id":1,"name":"daiki iijima","mail":"daiki@example.com"]

let jsonData = try! JSONSerialization.data(withJSONObject: jsonDic) // Data型で返ってくる

let jsonStr = String(bytes: jsonData, encoding: String.Encoding.utf8)! // String型に変換したい場合

print(jsonStr);

解説

  1. JSONに変換するためのDictionary型を準備する

    1
    let jsonDic:[String : Any] = ["id":1,"name":"daiki iijima","mail":"daiki@example.com"]
  2. 変換したデータをJSONSerialization.data()でシリアライズする

    1
    let jsonData = try! JSONSerialization.data(withJSONObject: jsonDic)
  3. Data型を文字列に変換する(任意)

    1
    let jsonStr=String(data: json, encoding: .utf8)!

デシリアライズ

サンプルコード

1
2
3
4
5
6
7
8
9
let jsonStr: String = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"

let jsonData = jsonStr.data(using: String.Encoding.utf8)!

let jsonDic = try! JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String,Any>

print(jsonDic["id"]!)
print(jsonDic["name"]!)
print(jsonDic["mail"]!)

解説

  1. JSON文字列を用意する

    1
    let jsonStr: String = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"
  2. 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)!
  3. 変換したデータを指定のDictionary型に変換する

    1
    let jsonDic = try! JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String,Any>
  4. Dictionary型の呼び出し方で呼び出して使用する
    変換後はOptional型

    1
    2
    3
    print(jsonDic["id"]!)
    print(jsonDic["name"]!)
    print(jsonDic["mail"]!)

Codebleを使用する方法

Codebleは、構造体をData型として扱えるようにするためのProtcol

以下の構造体はこのあとのシリアライズデシリアライズ処理で使用するCodebleを実装した構造体です。

1
2
3
4
5
6
struct User: Codable
{
var id : Int
var name : String
var mail : String
}

シリアライズ

サンプルコード

1
2
3
4
5
6
7
8
let user = User(id: 1, name: "daiki iijima", mail: "daiki@example.com")

let encoder = JSONEncoder()
let jsonData: Data = try! encoder.encode(user)

let jsonStr=String(data: jsonData, encoding: .utf8)! // String型に変換したい場合

print(jsonStr)

解説

  1. データを入れる構造体を用意して、パースした値をいれていく

    1
    let user = User(id: 1, name: "daiki iijima", mail: "daiki@example.com")
  2. JSONEncoderを使用して構造体をJSON(Data型)にシリアライズする
    この変換で返ってくる値は、Data型

    1
    2
    let encoder = JSONEncoder()
    let jsonData: Data = try! encoder.encode(user)
  3. Data型を文字列に変換する(任意)

    1
    let jsonStr=String(data: jsonData, encoding: .utf8)! // String型に変換したい場合

デシリアライズ

サンプルコード

1
2
3
4
5
6
7
8
9
10
let jsonStr = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"

let jsonData = jsonStr.data(using: .utf8)!

let decoder = JSONDecoder()
let user:User = try! decoder.decode(User.self, from: jsonData)

print(user.id)
print(user.name)
print(user.mail)

解説

  1. JSON文字列を用意する

    1
    let jsonStr = "{\"id\":1,\"name\":\"daiki iijima\",\"mail\":\"daiki@example.com\"}"
  2. 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)!
  3. JSONDecoderを使用してData型をデシリアライズする

    1
    2
    let decoder = JSONDecoder()
    let user:User = try! decoder.decode(User.self, from: jsonData)
  4. 構造体のプロパティを呼び出すことでデータにアクセスできる

    1
    2
    3
    print(user.id)
    print(user.name)
    print(user.mail)

どちらを使えばいいのか

特別な理由がない限り、Codebleを使用した方法のほうが取り扱いがしやすいと思います。

参考

JSONパース関係

データ型について

Author

Daiki Iijima

Posted on

2021-06-29

Updated on

2024-04-17

Licensed under