LoginSignup
0
1

More than 3 years have passed since last update.

[iOS]プロジェクト内のJSONファイルを取得する方法

Last updated at Posted at 2021-03-27

概要

自分が直近やったことを備忘録として書きます。
iosアプリで事前に準備したJSONファイルを読み込んで、表示するということをやったのでまとめます。

環境

・mac
・Xcode(Version 12.0.1)
・Swift UI

JSONファイルを準備

今回は下記のJSONを用意して使用しました。

{
  "GoodMorning":"good morning",
  "Hello":"hello",
  "GoodEvening":"Good evening",
  "Test": {
      "Name":"name",
      "PassWord":"password"
  }
}

JSONファイルを作成したらプロジェクト内に配置します。

データモデルを作成

用意したJSONファイルにあったデータモデルを作成します。

import Foundation


struct SampleModel: Codable {
    let goodMorning, hello, goodEvening: String
    let test: Test

    enum CodingKeys: String, CodingKey {
        case goodMorning = "GoodMorning"
        case hello = "Hello"
        case goodEvening = "GoodEvening"
        case test = "Test"
    }
}


struct Test: Codable {
    let name, passWord: String

    enum CodingKeys: String, CodingKey {
        case name = "Name"
        case passWord = "PassWord"
    }
}

このデータモデルですが簡単に作ってくれるサービスがあるので、今回はそれを使って作成しました。
https://quicktype.io/

JSONから取得したデータをオブジェクトに変換

JSONファイルとそのJSON用のデータモデルが用意できたら、JSONを呼び出して、実際に使用できる様にするための処理を書いていきます

import Foundation
func ReadJson() throws -> SampleModel?{
    //①JSONファイルのパスを取得
    guard let path = Bundle.main.path(forResource: "sample", ofType: "json") else {
        return nil
    }
    //②パスからJSONファイルのデータを取得
    let url = URL(fileURLWithPath: path)

    //③JSONDecoder()を使用してデータモデルのSampleModelオブジェクトに変換する
    let sampleData = try? JSONDecoder().decode(SampleModel.self, from: Data(contentsOf: url))

    return sampleData
}

ReadJson()という関数を作成して、returnとしてデータモデルで作成したSampleModelオブジェクトに変換して返すようにしています。

①で書いたパスの取得ですが、
Bundle.main.pathで取得できるのはアプリケーションバンドルにあるものしか取得できない様です。
テストコードを書いている際に、テストバンドル内のJSONのパスを取得したいってなった時は

let testBundle = Bundle(for: type(of: self))
let path = testBundle().url(forResource: "sample", withExtension: "json")

の様に書くと取得できます。

③で使用しているJSONDecoder()は、JSONから取得したデータをデータモデルで書いたオブジェクトのかたちに変換してくれるらしいです。

画面上に表示してみる

今回はJSONからちゃんと取得できているかというところだけを確認したかったのでTextとして羅列させてみました。

struct ContentView: View {
    let text: SampleModel = try! ReadJson()!
    var body: some View {
        Text(text.goodMorning)

        Text(text.hello)

        Text(text.goodEvening)

        Text(text.test.name)

        Text(text.test.passWord)
    }
}

上記を追加した後にビルドしてみると
スクリーンショット 2021-03-27 15.40.48.png
ちゃんと取得できてますね。

最後に

今回初投稿です。
自分の備忘録のつもりで書いていますが、自分以外の人が読んでもわかる記事になっているかが正直不安です…
今後も定期的に書いていくつもりなのでその都度精進していきます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1