본문 바로가기

IOS Swift

[iOS+8] Swift JSON null 디코딩 처리 방법

  • 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 = ""

 

 

참고 사이트

반응형