티스토리 뷰
안녕하세요.
오늘은 iOS 개발에 가장 필수적인 parsing과 관련된 ObjectMapper와 codable에 대해 정리해 보려고 합니다.
일단 임의의 JSON String을 만들고 ObjectMapper와 codable을 이용해서 각 Model을 만든 후 parsing 해보겠습니다.
let jsonString = """
{
"msg": "success",
"data": {
"token": "skfkajopdjvosvjopcvjs",
"name": "gwan",
"age": 28
}
}
"""
ObjectMapper
임의로 JSON String을 생성했고, json 형태를 보고 Mappable 프로토콜을 채택한 Model을 만들었습니다.
struct Profile: Mappable {
var msg: String?
var data: Person?
init?(map: Map) {
}
mutating func mapping(map: Map) {
msg <- map["msg"]
data <- map["data"]
}
}
struct Person: Mappable {
var token: String?
var name: String?
var age: Int?
init?(map: Map) {
}
mutating func mapping(map: Map) {
token <- map["token"]
name <- map["name"]
age <- map["age"]
}
}
Profile 구조체 안에 msg와 Person타입의 data 프로퍼티가 있고 Person타입에 json의 data부분에 있는 프로퍼티가 정의되어 있습니다.
이제 위에서 만든 jsonString을 가지고 매핑이 가능합니다.
let profile = Profile(JSONString: jsonString)
guard let profileData = profile else { return }
print(profileData.msg) //Success
print(profileData.data?.token) //skfkajopdjvosvjopcvjs
print(profileData.data?.name) //gwan
print(profileData.data?.age) //28
Codable
cadable 프로토콜을 채택한 모델을 만들겠습니다.
struct Profile: Codable {
var msg: String?
var data: Person?
struct Person: Codable {
var token: String?
var name: String?
var age: Int?
}
}
ObjectMapper와 달리 키값을 설정하는 부분은 없습니다. 프로퍼티명이 json의 키값으로 쓰입니다.
모델의 프로퍼티 명이 json 프로퍼티명과 일치하면 따로 처리해줄 필요는 없으나 만약 다를 시에는 CodingKey 프로토콜을 사용하여야 합니다.
struct Person: Codable {
var token: String?
var name: String?
var age: Int?
enum CodingKeys : String, CodingKey{
case token
case name
case age = "birth"
}
}
위와 같은 형태로 CodingKey프로토콜을 채택한 Enum을 생성해 준 후 해당 모델의 프로퍼티명과 동일하게 case를 생성해 줍니다.
프로퍼티명이 json의 프로퍼티명과 일치할 경우 그냥 두면 되고 이름이 다를 경우에는 age처럼 대입 연산자로 해당 json의 프로퍼티명을 넣어주면 됩니다.
내부적으로 파싱 할 때 rawValue를 사용하기 때문에 case에 아무런 값도 할당하지 않을 시 case명이 키값이 되므로 따로 처리하지 않는 것 같고 키값이 다른 경우에만 값을 대입하는 것으로 보입니다.
이제 만든 모델에 파싱 해보겠습니다.
let decoder = JSONDecoder()
let data = jsonString.data(using: .utf8)!
if let profile = try? decoder.decode(Profile.self, from: data) {
print(profile.msg) //success
print(profile.data?.token) //skfkajopdjvosvjopcvjs
print(profile.data?.name) //gwan
print(profile.data?.age) //28
}
ObjectMaaper와 codable을 활용해서 json parsing을 해봤는데
기능 자체는 비슷한 것 같고 사용 방식과 외부 라이브러리이냐 아니냐 정도의 차이만 있는 것 같습니다.
swift4 버전에서 codable이 생긴 후로 외부 라이브러리인 ObjectMaaper는 사용할 필요가 없어졌다는 얘기가 많은데
사용하기에도 codable이 훨씬 간편하고 기능 또한 비슷한 걸로 보여서 레거시 코드를 유지보수하는 게 아니라면 ObjectMaaper를 사용할 일은 많지 않을 것 같습니다.
'iOS' 카테고리의 다른 글
[iOS] NSCache를 이용한 이미지 캐싱 (0) | 2021.07.12 |
---|---|
iOS 아키텍처 패턴 MVVM (0) | 2021.06.22 |
[iOS] 비동기 API 호출 UnitTest 하는법 (0) | 2021.06.21 |
[iOS] Authenticator 프로토콜로 JWT 인증 구현하기 (0) | 2021.06.07 |
iOS 아키텍처 패턴 VIPER (0) | 2021.05.14 |
- Total
- Today
- Yesterday
- 프로퍼티래퍼
- ios 유닛테스트
- ios cache
- ios 디자인패턴
- UserDefault
- swift mvvm
- rxswift안쓰고
- 아키텍처패턴
- MVVM패턴
- 앱개발 디자인패턴
- SWIFT
- swift 캐싱
- ios memory
- @propertyWrapper
- ios 이미지캐싱
- UserDefaultKey
- wrappedValue
- 비동기 유닛테스트
- ios image caching
- ios 캐시
- api호출 unittest
- 연산프로퍼티
- ios 캐시메모리
- inputoutput패턴
- ios 패턴
- UserDefaults
- swift cache
- ios expectation
- NSCache
- rxswift 없이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |