아요 개발 일기
[iOS]JSON ObjectMapper vs. Codable (Decodable, Encodable) 본문
반응형
안녕하세요~~
오늘은 Api 통신할때 아주아주정말정말 중요하고 필수적인 parsing과 관련하여 알아보겠습니다!!
우선 아래와 같은 JSON String이 있다고 가정하구 시작하겠습니당
let json_str = """
{
"name":"sojin",
"age":20,
"city":"New York"
}
"""
ObjectMapper
ObjectMapper는 JSON을 객체로(또는 그 반대로) 변환할 수 있는 프레임 워크입니다.
import ObjectMapper
class UserDTO: Mappable {
var name : String?
var age : Int?
var city : String?
required init?(map: Map) {
}
func mapping(map: Map) {
name <- map["name"]
age <- map["age"]
city <- map["city"]
}
}
Codable
Codable은 Encodable과 Decodable을 합쳐 놓은 것을 말 합니다.
Codable은 모델 작성이 간편하다는 장점이있는데,
class UserDTO: Codable {
var name : String?
var age : Int?
var city : String?
}
let decoder = JSONDecoder()
let data = jsonString.data(using: .utf8)!
if let profile = try? decoder.decode(Profile.self, from: data) {
print(profile.name)
ObjectMapper와 달리 키 값을 설정하는 부분은 없습니다. 프로퍼티명이 Json의 키 값으로 쓰입니다.
모델의 프로퍼티 명이 json 프로퍼티명과 일치하면 따로 처리해줄 필요는 없으나 만약 다를 시에는 CodingKey 프로토콜을 사용하여야 합니다.
또한 문자열로 이루어진 JSON데이터를 .utf8 형식으로 바꿔주고 JSONDecoder() 를 이용해서 디코딩을 해주어야 하는 번거로움이 있지만 모델 작성이 간편합니다.
먼저 Encodable과 Decodable에대해서 알아야겠죠?
Encodable -> data를 Encoder해서 프로토콜로 변환
Decodable -> data를 원하는 모델로 Decode
json을 예로 들자면,
Encodable -> 모델을 json으로 인코드
Decodable -> json을 내가 원하는 모델로 디코드
ObjectMapper와 Codable의 차이점
ObjectMapper
- 타사 프레임워크
- 유형 변환을 지원
- Codable보다 빠름. (또는 JSONEncoder/Decoder보다 더 정확하게)
- 새 Swift 버전 릴리스에서는 ObjectMapper를 사용하여 업데이트를 약속하지 않음
- 프로젝트에 추가 종속성을 추가해야함
- BaseMappable 프로토콜에서 추가로 상속된 프로토콜
- CocoaPods 또는 기타 종속성 관리자를 사용하여 절대 버전을 업데이트해야 함
- JSON에 대한 키가 있는 모든 필드에 대한 매핑을 정의해야 함
Codable
- Swift 네이티브 솔루션
- 매핑 솔루션을 구축했기 때문에 ObjectMapper보다 느릴 수 있음. 코딩 키가 없으면 swift는 미러를 사용하여 클래스 속성을 읽은 다음 매핑
- 유형 변환을 위한 외부 라이브러리가 필요함
- 구문 분석 및 매핑에 대한 타사 종속성을 제거함
- 모델 객체 필드가 JSON 키와 다른 경우 CodingKey 프로토콜을 사용하여 키를 열거형으로 정의해야함
- Encodable 및 Decodeable의 두 가지 다른 프로토콜로 구성된 프로토콜
- 필드가 JSON에서와 같은 키와 이름을 가진 경우 자동으로 인코딩 및 초기화 메소드를 생성하므로 더 적은 코드가 필요함
- 기본 솔루션이므로 Foundation 프레임워크에서 새 업데이트를 사용할 수 있음
반응형