Codable で JSONを読み込み

2020/01/30

Codable を利用して、JSONを 構造体の配列で扱ってみる

構造体を定義

JSONのデータにあわせて、Codable クラスの構造体を定義する。


struct HiraganaEntry: Codable {
    var word:String
    var kana:String
    var length:Int
}

Entityを定義

カスタムクラスのEntity の配列を定義する


var hiraganaEnties: [HiraganaEntry] = []

JSONファイルのパスを設定する

Bundle.main.path() でプロジェクト内の JSON ファイルのパスを作成する。

  • forResource: ファイル名
  • ofType: 拡張子

guard let path = Bundle.main.path(forResource: name, ofType: "json") else { return nil }

JSONを読み込む

ファイルパスから UTF-8 で String型で読み込む


let json:String
json = try String(contentsOfFile: path, encoding: .utf8)

JSONデコード

JSON(String)を、定義したEntity の配列でデコードする


let entries = try! jsonDecoder.decode([HiraganaEntry].self, from: (json.data(using: .utf8)!))

全体のコード


    let jsonDecoder = JSONDecoder()
    var hiraganaEnties: [HiraganaEntry] = []
    
    struct HiraganaEntry: Codable {
        var word:String
        var kana:String
        var length:Int
    }

    func getJSON(name:String) -> Codable? {
        let json:String
        guard let path = Bundle.main.path(forResource: name, ofType: "json") else { return nil }
        do {
            json = try String(contentsOfFile: path, encoding: .utf8)
        } catch _ {
            return nil
        }
        let entries = try! jsonDecoder.decode([HiraganaEntry].self, from: (json.data(using: .utf8)!))
        return entries
    }
    
    func loadHiragana() {
        hiraganaEnties = getJSON(name: "file_name") as! [GameViewController.HiraganaEntry]
        print(hiraganaEnties.randomElement())
    }