[iOS] 프로젝트에서 JSON 파일을 얻는 방법

3205 단어 XcodeJSONSwift

개요



자신이 최근에 한 일을 비망록으로 씁니다.
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"
    }
}

이 데이터 모델이지만 쉽게 만들어주는 서비스가 있으므로 이번에는 그것을 사용하여 만들었습니다.
htps : // 쿠이 CKTY ぺ. 이오/

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)
    }
}

위를 추가한 후 빌드해 보면

제대로 얻을 수 있네요.

마지막으로



이번 첫 투고입니다.
자신의 비망록의 생각으로 쓰고 있습니다만, 자신 이외의 사람이 읽어도 아는 기사가 되어 있는지가 솔직히 불안합니다…
앞으로도 정기적으로 써서 여러분이므로 그때마다 정진해 나갈 것입니다.

좋은 웹페이지 즐겨찾기