공공api 받아오기 글에서 json parsing이 안되어 다시 작성한다.
<https://www.youtube.com/watch?v=YY3bTxgxWss&t=77s> 여기 영상을 보고 전체적으로 공부하는 편이 좋겠다. codable에 대해 공부하려 하는데 글을 읽으니 진짜 기본적인 것만 일단 이해 된다.
내 코드가 안되는 이유는 내 추측에 내가 선언한 값이 없을 경우 위에서는 ?? "" 으로 nil인 경우가 없게 해주는 부분이 없어서 그런가 싶다.
Course에 들어가는 json 인자가 [String : Any]로 타입 캐스팅 되어 넘어가야 된다.
사실 위에의 방법은 swift2,3 objc의 방법이라고 한다.
결국 여기 까지 해서 에러 메시지를 확인했다.
public struct WeatherINF : Codable{
var rnSt: Int = 0 //강수형태
var wf: String = "" //날씨
init(json : [String: Any]){
rnSt = json["rnSt"] as? Int ?? -1
wf = json["wf"] as? String ?? ""
}
}
do{
//decode is not working properly
let jsonDerived = try JSONDecoder().decode(WeatherINF.self, from : data)
//set struct
print(jsonDerived.wf)
} catch let jsonErr {
print("Error seriallizing json:",jsonErr)
}
{"response":{"header":{"resultCode":"00","resultMsg":"NORMAL_SERVICE"},"body":{"dataType":"JSON","items":{"item":[{"announceTime":202003061100,"numEf":0,"regId":"11A00101","rnSt":30,"rnYn":0,"ta":8,"wd1":"SE","wd2":"S","wdTnd":"1","wf":"흐림","wfCd":"DB04","wsIt":"1"}]},"pageNo":1,"numOfRows":1,"totalCount":5}}}
Error seriallizing json: keyNotFound(CodingKeys(stringValue: "rnSt", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"rnSt\", intValue: nil) (\"rnSt\").", underlyingError: nil))
있는데 도대체 왜 없다는거야 .... <https://zeddios.tistory.com/394>
근데 내 출력을 잘 보니 내 json은 array라서 그런가 싶다. <https://stackoverflow.com/questions/42081141/how-to-parse-array-of-json-to-array-in-swift>
전부 key에 대한 value가 dictionary이다 보니 ,
[CodingKeys(stringValue: "response", intValue: nil)], debugDescription: "Expected to decode String but found a dictionary
이런 에러가 발생한다.
어떡해야될까
<https://app.quicktype.io/> 사람들에게 물어봤더니 이 사이트를 알려주셨다. ㅎㅎ
결국 아래의 구조체들이 Codable을 사용하기 위해서 필요했다. 코더블을 사용하려면 아래 같이 데이터를 형태에 맞게 작성해주어야 하니까.
추가 - 전에는 잘 모르고 사용한 방법이 Codable인데, 요즘은 ObjectMapper를 주로 사용한다. swiftyJson도 종종 사용되는거 같다.
각각이 장단점이 있는데, 기존에는 ObjectMapper를 많이썼고, swiftJson은 좀 덜쓰여지는거 같고 점점. 요즘은 Codable이 좀 대세로 떠오르는거 같다.
'ios개발 > 프로젝트' 카테고리의 다른 글
<스위프트 프로젝트> 스토리보드 여러개 만들기, 로딩 화면 구현해 보자. (0) | 2020.03.08 |
---|---|
<스위프트 프로젝트> UILabel sizeToFit(), UIImageView에 원격 url에서 가져온 이미지 넣기 (0) | 2020.03.07 |
<스위프트 프로젝트> 커스텀 뷰 만들기! (0) | 2020.03.07 |
<스위프트 프로젝트> 뷰 컨트롤러에 테이블 뷰를 띄워 보자! (0) | 2020.03.06 |
<스위프트 프로젝트> 공공 api 받기 (0) | 2020.03.04 |