#概要
自分が直近やったことを備忘録として書きます。
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)
}
}
上記を追加した後にビルドしてみると
ちゃんと取得できてますね。
#最後に
今回初投稿です。
自分の備忘録のつもりで書いていますが、自分以外の人が読んでもわかる記事になっているかが正直不安です…
今後も定期的に書いていくつもりなのでその都度精進していきます。