- Codable : iOS+8
JSON에 Key or Value 가 null이 올 때 다음과 같이 처리할 수 있습니다.
1. 옵셔널(Obtional) 처리
// JSON
{
"age": 20
}
// Decode Object
struct Human: Codable {
var age: Int
var money: Int? // 옵셔널 안해주면 Decode Error 발생
}
age = 20
money = nil
2. 기본값 넣어주기
// JSON
{
"age": 20
}
// Decode Object
struct Human: Codable {
var age: Int
var money: Int
var nationality: String
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
age = (try? values.decode(Int.self, forKey: .age)) ?? 1
money = (try? values.decode(Int.self, forKey: .money)) ?? 0
nationality = (try? values.decode(String.self, forKey: .nationality)) ?? ""
}
}
age = 20
money = 0
nationality = ""
2-1. Property Wrapper로 기본값 넣어주기
// JSON
{
"age": 20
}
// Decode Object
struct Human: Codable {
var age: Int
@DefaultJsonInt var money: Int
@DefaultJsonString var nationality: String
}
@propertyWrapper
struct DefaultJsonString: Codable {
let wrappedValue: String
init() {
self.wrappedValue = ""
}
}
@propertyWrapper
struct DefaultJsonInt: Codable {
let wrappedValue: Int
init() {
self.wrappedValue = 0
}
}
extension KeyedDecodingContainer {
func decode(_ type: DefaultJsonString.Type, forKey key: Key) throws -> DefaultJsonString {
// key가 없거나 value가 null 이여서 nil이 반환된다면 DefaultJsonString의 기본 이니셜라이저로 반환
try decodeIfPresent(type, forKey: key) ?? .init()
}
func decode(_ type: DefaultJsonInt.Type, forKey key: Key) throws -> DefaultJsonInt {
try decodeIfPresent(type, forKey: key) ?? .init()
}
}
age = 20
money = 0
nationality = ""
참고 사이트
반응형
'IOS Swift' 카테고리의 다른 글
Xcode cloud (1) - Setting (0) | 2023.06.04 |
---|---|
[iOS+2] CALayer 알아보기 (shadow, gradient, animation) (0) | 2023.05.07 |
[iOS 13+] Compositional Layout (0) | 2023.04.09 |
Apple 멤버쉽이 만료되면 발생되는 일(feat. iOS) (0) | 2023.01.25 |
Firebase Distribution(feat. iOS) (2) | 2023.01.20 |