2017-11-03 1 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... 
} 

私はそれが役に立ちそうです。