코딩
Swift 공공데이터 parsing 본문
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15081240
코로나19 예방접종 위탁의료기관 조회서비스데이터 swift로 불러오기
1. JSON데이터 불러오기
override func viewDidLoad() {
if let url = URL(string:"사이트제공주소") {
let request = URLRequest.init(url: url)
URLSession.shared.dataTask(with: request) {
(data, response, error) in guard let data = data else {return}
let decoder = JSONDecoder()
print(response as Any)
do{ let json = try decoder.decode(hospitalData.self , from: data)
print(json)
}
catch{
print(error)
}
}.resume()
}
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
URLSession.shared.dataTask(with: request) 을 해주면 사이트로 부터 data, request 그리고 error 유형을 불러올 수 있다.
우리가 Codable을 이용하여 출력하고자 하는 데이터는 data지만, 요청이 잘 되었는지 어떤 에러가 발생했는지 확인을 하기 위해서는
위와 같이 response와 error 또한 확인해주면서 Build를 해주는것이 좋다.
response는 1.URL 2.Status Code 3.Header 에 대한 정보를 담고있다.
URL
위의 코드에서 Url로 써준 부분이며, serviceKey= 뒷부분은 내가 할당받은 개인고유키를 써주면 된다.
Status Code
200 | 성공적으로 수행됨 |
400, 401 | 인증정보가 정확하지 않음 |
500 | API 서버에 문제가 발생하였음 |
위의 코드는 StatusCode: 200이므로 성공적으로 데이터를 불러 왔음을 알 수 있다.
꼭 StatusCode가 200인지 확인하고 다음단계로 넘어가야한다****
Header
파일에 대한 정보를 알 수 있다.
2. JSON파일 Decode
do{ let json = try decoder.decode(hospitalData.self , from: data)
print(json)
}
catch{
print(error)
}
hospitalData: url로 불러온 JSON파일의 규격에 맞춘 struct
JSON파일을 읽어주기 위해서, Xcode의 프로젝트 안에 이와 똑같은 구조를 가진 struct를 만들어 주어야한다.
//hospitalData.swift
import Foundation
struct hospitalData: Decodable{
let currentCount: Int
let data: [Data]
}
struct Data: Decodable{
var orgcd: String
var orgnm: String
var orgTlno: String
var orgZipaddr: String
var slrYmd: String
var dywk: String
var hldyYn: String
var lunchSttTm: String
var lunchEndTm: String
var sttTm: String
var endTm: String
}
일단, '기본적으로' 동일한 struct를 만들어 주었다. 하지만 이를 작동시키면
"Expected String value but found null instead."
error가 출력된다. 이는 JSON에 lunchSttTm: null인 정보가 있지만, null값에 대한 아무런 조치를 취하지 않았다는것
이는 간단하게 String뒤에 ?를 추가하여 해결해줄 수 있다.
struct Data: Decodable{
var orgcd: String
var orgnm: String
var orgTlno: String
var orgZipaddr: String
var slrYmd: String
var dywk: String
var hldyYn: String
var lunchSttTm: String?
var lunchEndTm: String?
var sttTm: String?
var endTm: String?
}
3. 출력화면
data는 배열로 접근할 수 있다.
do{ let json = try decoder.decode(hospitalData.self , from: data)
for d in json.data{
print(d)
}
}
'Swift' 카테고리의 다른 글
Swift combination구현 (0) | 2021.07.01 |
---|---|
Swift 딕셔너리에서 값 가져오기 (0) | 2021.06.30 |
Swift String 자르기 (0) | 2021.06.30 |
Xcode playground 사용하기 (+문제점) (0) | 2021.06.29 |