ios개발/프로젝트

<스위프트 프로젝트> json parsing!!, swift5 쉽게 파싱하는 방법 , quicktype

studying develop 2020. 3. 6. 12:49

공공api 받아오기 글에서 json parsing이 안되어 다시 작성한다.

 

https://www.youtube.com/watch?v=YY3bTxgxWss&t=77s

 

<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://stackoverflow.com/questions/47013681/swift-codable-expected-to-decode-dictionarystring-anybut-found-a-string-data> ??

 

<https://app.quicktype.io/> 사람들에게 물어봤더니 이 사이트를 알려주셨다. ㅎㅎ

 

결국 아래의 구조체들이 Codable을 사용하기 위해서 필요했다. 코더블을 사용하려면 아래 같이 데이터를 형태에 맞게 작성해주어야 하니까.

 

그대로 가져다 사용하면 된다. ㅎㅎ

 


추가 - 전에는 잘 모르고 사용한 방법이 Codable인데, 요즘은 ObjectMapper를 주로 사용한다. swiftyJson도 종종 사용되는거 같다.

각각이 장단점이 있는데, 기존에는 ObjectMapper를 많이썼고, swiftJson은 좀 덜쓰여지는거 같고 점점. 요즘은  Codable이 좀 대세로 떠오르는거 같다.