2017-11-03 2 views
2

에 대한 사용이 복호 나는 그런 형식으로 json 있습니다사용자 정의 JSON 디코딩

{ 
    "route":{ 
     "1":"Atrakcyjno\u015b\u0107 przyrodnicza", 
     "2":"Atrakcyjno\u015b\u0107 kulturowa", 
     "3":"Dla rodzin z dzie\u0107mi", 
     "5":"Dla senior\u00f3w", 
     "6":"Dla or\u0142\u00f3w", 
     "8":"Niepe\u0142nosprawni" 
    }, 
    "apartments":{ 
     "1":"WifI", 
     "4":"Gastronomia", 
     "5":"Parking", 
     "6":"Dla niepe\u0142nosprawnych", 
     "7":"Dla rodzin z dzie\u0107mi", 
     "8":"Dla senior\u00f3w" 
    }, 
    "levels":{ 
     "1":"\u0141atwy", 
     "2":"\u015aredni", 
     "3":"Trudny", 
     "4":"Bardzo trudny" 
    } 
} 

나는 가능한 한 간단하게 디코딩하고 싶지만, 나는이 하위 사전을 디코딩하는 방법을 모르겠어요. 이들은 dicts이지만, 대신 array이어야합니다. 내가 어쨌든 뭔가를 써도 특별한 방식으로 해독 할 수 있도록 배열을 얻을 수 있을까요? 지금까지 나는 다음과 같은 것을 가지고있다 :

struct PreferencesList: Decodable { 

    private enum CodingKeys: String, CodingKey { 
     case routes  = "route" 
     case apartments 
     case levels 
    } 

    let routes:  [Preference] 
    let apartments: [Preference] 
    let levels:  [Preference] 
} 

struct Preference: Decodable { 
    let id: Int 
    let name: String 
} 

답변

2

나는이 단계를 단계적으로 수행 할 필요가 있다고 생각한다.

구조체를 그대로 유지하십시오. PreferenceDecodable 일 필요는 없습니다. 그런 다음 init(from decoder: Decoder) throws 기능을 다음과 같이 재정의하십시오.

init(from decoder: Decoder) throws { 
    let container = try decoder.container(keyedBy: CodingKeys.self) 
    let routes = try container.decode([String: String].self, forKey: .routes) 
    self.routes = [] 
    for (key, value) in routes { 
     self.routes.append(Preference(id: key, name: value)) 
    } 
    // Do the same for other var... 
} 

도움이되기를 바랍니다.