JSON String을 파싱하기 위한 모델을 만들 때, Codable 외에도 ObjectMapper를 이용하는 방법이 있다고 한다.
늘 Codable로 Model을 만들어서 썼었는데, 예전 프로젝트 수정 업무를 맡게 되어 코드를 살펴보다 ObjectMapper를 발견하고 신기해서 찾아보게 되었다.
ObjectMapper는 외부 라이브러리이기 때문에 Swift4 버전에서 Codable이 생긴 이후로는 사용하기에도 훨씬 간편하고 기능도 비슷한 Codable을 주로 사용하게 되어, 레거시 코드를 유지보수하는 경우가 아니라면 ObjectMapper는 굳이 사용할 일이 없게 되었다고 한다.
확실히 Codable이 사용하기 훨씬 편해보여 앞으로도 ObjectMapper를 쓸 일은 없을 것 같지만 그냥 참고용으로 알아만 두기로.
let jsonString = """
{
"id": 0,
"name": "hongssup"
"age": 20
}
"""
이러한 임의의 JSON String이 있다고 가정하고 이를 파싱하기 위한 모델을 두가지 방식으로 만들어 보자.
ObjectMapper
import ObjectMapper
struct Profile: Mappable {
var id: Int?
var name: String?
var age: Int?
var birthDate: String?
mutating func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
age <- map["age"]
birthDate <- map["birth_date"]
}
}
let profile = Profile(JSONString: jsonString)
guard let profileData = profile else { return }
print(profileData.name) //hongssup
외부 라이브러리 ObjectMapper를 import 해주고 Mappable 프로토콜을 사용하여 모델을 만들어 줄 경우, 각각의 인스턴스에 굳이 mapping을 해줘야 하는 번거로움이 있는 것 같다.
아무튼 이런 식으로 파싱해서 사용이 가능하다.
Codable
struct Profile: Codable {
var id: Int?
var name: String?
var age: Int?
var birthDate: String?
enum CodingKeys: String, CodingKey {
case id, name, age
case birthDate = "birth_date"
}
}
let decoder = JSONDecoder()
let data = jsonString.data(using: .utf8)!
if let profile = try? decoder.decode(Profile.self, from: data) {
print(profile.name) //hongssup
}
JSON으로 받아온 프로퍼티명과 일치할 경우는 따로 처리해줄 필요가 없지만, 다를 경우 CodingKeys 를 사용해서 매핑을 해줄 수 있다.
문자열로 이루어진 JSON데이터를 .utf8 형식으로 바꿔주고 JSONDecoder() 를 이용해서 디코딩을 해주어야 하는 번거로움이 있지만 모델 작성이 간편하고 익숙해서 그런가 사용하기에도 더 편한 느낌.
참고 : iOS on Gwan
'초보 iOS 개발자의 일상 > 개발 업무' 카테고리의 다른 글
[Swift iOS] 사파리로 링크 열기 Open url in safari (0) | 2021.06.02 |
---|---|
[Swift iOS] Section Index Title 한글 초성 가져오기 UnicodeScalar (0) | 2021.05.31 |
[Swift iOS] UIView layout update cycle & methods (0) | 2021.05.28 |
[Swift iOS] UIActivityViewController 카톡으로 공유하기 (0) | 2021.05.27 |
[Swift iOS] UserDefaults 사용 및 문자열 치환 replacingOccurrences (0) | 2021.05.26 |