使用decodable进行自定义json解码

时间:2017-11-03 07:15:25

标签: json swift decode

我的格式为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
}

1 个答案:

答案 0 :(得分:2)

我想你需要一步一步地做这件事。

让你的结构保持原状。 Preference不需要Decodable。然后,像这样覆盖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...
}

我希望它有所帮助。