Swiftで簡単なJSONの取り扱い

# はじめに
JSONの取り扱いがよくわからなかったので簡単な操作をメモです

## Data型
バイト列を表す　画像もJSONもバイト列によって表現できます
## デコードとエンコード
### エンコード 符号化
全角文字や制御文字を問題なく送信するために半角文字に置き換える技術
SwiftではJSONEncoderクラスがあるのでそれを使ってSwiftの値をJSONバイト列にエンコードします

### デコード 復元化
エンコードから復元する技術
JSONDecoderクラスを使ってJSONバイト列をswiftの値にデコードします
サーバーからデータを受信する程で行うので今回はデコードを使います
    https://developer.apple.com/documentation/foundation/jsondecoder/2895189-decode
## Codableプロトコル
### EncodableとDecodableを組み合わせたプロトコル
Decodableプロトコルのinit(from:)メソッドとEncodableプロトコルのencode(to:)メソッドを実装しなくてもコンパイラがコードの自動生成をするのでを実装しなくてもよい便利なプロトコルです。
https://qiita.com/s_emoto/items/deda5abcb0adc2217e86
https://developer.apple.com/documentation/swift/codable


## サンプルコード
```swift
import Foundation

func sampleData() -> Data {
    return"""
{
    "id": 1,
    "name": "テストユーザ1",
    "mainText": "こんにちは！"
}

""".data(using: .utf8)!
}

struct UserModel: Codable {
    var id: Int
    var name: String
    var mainText: String
}
func getJSON() {
    let jsonDecoder = JSONDecoder()
    //　.decode(_:)メソッドに目的の型とデコード対象のData型の値を渡す
    guard let decodedUserModel = try? jsonDecoder.decode(UserModel.self, from: sampleData()) else {
        return
    }
    print(decodedUserModel)
}

getJSON()

```

## ルートが配列の場合
```swift
import Foundation

func sampleData() -> Data {
    return"""
        [
            {
                    "id": 1,
                    "name": "テストユーザ1",
                    "mainText": "こんにちは！"
            },
            {
                    "id": 2,
                    "name": "テストユーザ2",
                    "mainText": "こんばんは！"
            }
        ]
        """.data(using: .utf8)!
}

struct UserModel: Codable {
    var id: Int
    var name: String
    var mainText: String
}
func getJSON() {
    let jsonDecoder = JSONDecoder()
    // [UserModel].selfにしてデコードする値の型を決めます
    guard let decodedUserModel = try? jsonDecoder.decode([UserModel].self, from: sampleData()) else {
        return
    }
    for model in decodedUserModel {
        print(model.id)
        print(model.name)
        print(model.mainText)
    }

}

getJSON()
```
    
    
    
## ルートがオブジェクトで配列の場合
```swift
import Foundation

func sampleData() -> Data {
    return"""
        {
            "users": [
                {
                    "id": 1,
                    "name": "テストユーザ1",
                    "mainText": "こんにちは！"
                },
                {
                    "id": 2,
                    "name": "テストユーザ2",
                    "mainText": "こんばんは！"
                }
            ]
        }
        """.data(using: .utf8)!
}

struct UserModel: Codable {
    var id: Int
    var name: String
    var mainText: String
}
// [UserModel]型プロパティを持つCodableに準拠した構造体を作成
struct UserResponse: Codable {
    var users: [UserModel]
}
func getJSON() {
    let jsonDecoder = JSONDecoder()
    // デコードする値の型をUserResponseに設定
    guard let decodedUserModel = try? jsonDecoder.decode(UserResponse.self, from: sampleData()) else {
        return
    }
    print(decodedUserModel)
    for model in decodedUserModel.users {
        print(model.id)
        print(model.name)
        print(model.mainText)
    }
}
getJSON()

```

# 終わりに
簡単にJSONの取り扱いについてまとめました。
間違っていたら教えてください！
# 参考
https://programming-sansho.com/swift/how-to-codable/
［増補改訂第3版］Swift実践入門
https://gihyo.jp/book/2020/978-4-297-11213-4