i am stuck with decoding the following JSON sprites object (https://jsonblob.com/340d100d-747c-11eb-a6ca-bb7c9e892adf) because of repetitive keys that i don't understand how to represent in a Decodable Model. Currently i am using this Codable Model but i don't like the approach i am taking because it leads to create a lot of struct. Here is my current implementation which has a lot of repetitive code
Does anyone have any idea how this type of JSON would be mapped? I don't know if i should approach with struct + protocols or with class + inheritance
struct PokemonDetailsModel: Decodable {
// MARK: Properties
var name: String?
var base_experience: Int?
var order: Int?
var sprites: PokemonSpritesModel?
var stats: [PokemonStatsModel]?
var types: [PokemonTypesModel]?
}
struct PokemonSpritesModel: Decodable {
//MARK: Properties
// ======== SET Of keys that are repeated
var back_default: String?
var back_female: String?
var back_shiny: String?
var back_shiny_female: String?
var front_default: String?
var front_female: String?
var front_shiny: String?
var front_shiny_female: String?
// ======== SET Of keys that are repeated
var other: PokemonSpritesModelOther?
var versions: PokemonSpritesModelVersions?
}
struct PokemonSpritesModelOther: Decodable {
//MARK: Properties
var dreamWorld: PokemonSpritesModelOtherDreamWorld?
var officialArtwork: PokemonSpritesModelOtherOfficialArtwork?
private enum CodingKeys: String, CodingKey {
case officialArtwork = "official-artwork", dreamWorld = "dream_world"
}
struct PokemonSpritesModelOtherDreamWorld: Decodable {
//MARK: Properties
var front_default: String?
var front_female: String?
}
struct PokemonSpritesModelOtherOfficialArtwork: Decodable {
//MARK: Properties
var front_default: String?
}
}
struct PokemonSpritesModelVersions: Decodable {
//MARK: Properties
var generation_i: PokemonSpritesModelVersionsGenerationsI?
var generation_ii: PokemonSpritesModelVersionsGenerationsII?
// var generation_iii: PokemonSpritesModelVersionsGenerationsIII?
// var generation_iv: PokemonSpritesModelVersionsGenerationsIV?
// var generation_v: PokemonSpritesModelVersionsGenerationsV?
// var generation_vi: PokemonSpritesModelVersionsGenerationsVI?
// var generation_vii: PokemonSpritesModelVersionsGenerationsVII?
// var generation_viii: PokemonSpritesModelVersionsGenerationsVIII?
private enum CodingKeys: String, CodingKey {
case generation_i = "generation-i",
generation_ii = "generation-ii",
// generation_iii = "generation-iii",
// generation_iv = "generation-iv",
// generation_v = "generation-v",
// generation_vi = "generation-vi",
// generation_vii = "generation-vii",
// generation_viii = "generation-viii"
}
struct PokemonSpritesModelVersionsGenerationsI: Decodable {
//MARK: Properties
var red_blue: PokemonSpritesModelVersionsGenerationsColors?
var yellow: PokemonSpritesModelVersionsGenerationsColors?
private enum CodingKeys: String, CodingKey {
case red_blue = "red-blue", yellow
}
}
struct PokemonSpritesModelVersionsGenerationsII: Decodable {
//MARK: Properties
var crystal: PokemonSpritesModelVersionsGenerationsColors?
var gold: PokemonSpritesModelVersionsGenerationsColors?
var silver: PokemonSpritesModelVersionsGenerationsColors?
}
struct PokemonSpritesModelVersionsGenerationsColors: Decodable {
//****** Notes: Some of the keys here (i marked them with an asterisk) are not part of the Set of keys market in the 'sprites' json object that are shared across different models
var back_default: String?
var back_shiny: String?
var back_gray: String? // *
var back_female: String?
var back_shiny_female: String?
var front_default: String?
var front_shiny: String?
var front_gray: String? // *
var front_female: String?
var front_shiny_female: String?
}