Лучший способ обработать JSON со случайными строковыми данными в поле Numberri c? - PullRequest
0 голосов
/ 24 марта 2020

Интересно, может ли кто-нибудь помочь мне с лучшим способом обработки типа, который должен быть нумерацией c, но иногда отображается как строка?

enter image description here

Это только начало происходить, структура, которую я использую, приведена ниже, я не могу это исправить на сервере, но, очевидно, сбой в несогласованных данных _id = 156, но в Иране _id = "NO DATA"

[{"country": "China", "countryInfo": {"iso2": "CN", "iso3": "CHN", " _id ": 156," ш ": 35," длинный ": 105," флаг ":" https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/cn.png "}," случаи ": 81171," todayCases ": 78," смерти ": 3277, "todayDeaths": 7, "восстановить": 73159, "активный": 4735, "критические": 1573, "casesPerOneMillion": 56, "deathsPerOneMillion": 2}, { "страна": "Италия", "CountryInfo ": {" ISO2 ":" IT " "ISO3": "ITA", "_ идентификатор": 380, "ш": 42,8333, "длинные": 12,8333, "флаг":" https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/it.png "}," случаи ": 69176," todayCases ": 5249," смертей ": 6820," todayDeaths ": 743," восстановить ": 8326," активный ": 54030," критические ": 3393," casesPerOneMillion ": 1144, "deathsPerOneMillion": 113}, { "страна": "США", "CountryInfo": { "ISO2" : "NO DATA", "iso3": "NO DATA", "_ id": "NO DATA", "lat": 0, "long": 0, "flag": "https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/unknow.png "}," случаи ": 49976," todayCases ": 6242," смерти ": 634," todayDeaths ": 81," восстановить ": 368," активные ": 48974," критические ": 1175," casesPerOneMillion ": 151 "deathsPerOneMillion": 2}, { "страна": "Испания", "CountryInfo": { "ISO2": "ES", "ISO3": "ESP", "_ идентификатор": 724, "ш": 40, "длинный": - 4, "флаг": "https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/es.png"}, "дела": 39676, "todayCases": 4540, "смерть": 2800, "todayDeaths": 489, "выздоровел ": 3794," активный ": 33082," критический ": 2355," casesPerOneMillion ": 849," deathsPerOneMillion ": 60}, {" страна ":" Германия», "CountryInfo": { "ISO2": "DE" "ISO3": "ДЭУ", "_ идентификатор": 276, "ш": 51, "длинный": 9, "флаг": "https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/de.png"}, "дела": 32781, "todayCases": 3725, "смерти": 156, "todayDeaths": 33, "восстановить": 3133, "активный": 29492, "критический": 23, "casesPerOneMillion": 391, "deathsPerOneMillion": 2}, { "country": "Iran", "countryInfo": {"iso2": "NO DATA", "iso3": "NO DATA", "_ id": "NO DATA", "lat": 0, "long": 0, "флаг": "* ** 1035 одна тысяча тридцать четыре *"}, "случаи": 24811, "todayCases": 1762, "смерти": 1934, "todayDeaths": 122, "г ecovered ": 8913," активный ": 13964," критические ": 0," casesPerOneMillion ": 295," deathsPerOneMillion ": 23}]

1 Ответ

1 голос
/ 24 марта 2020

Вы можете написать пользовательский init(from), где вы пытаетесь декодировать _id, используя try?, чтобы сделать результат необязательным, что означает, что вам нужно изменить объявление свойства на необязательное

struct Country: Decodable {
    let country: String
    let countryInfo: CountryInfo
}
struct CountryInfo: Decodable {
    var iso2: String
    var iso3: String
    var id: Int?
    var lat: Double
    var long: Double
    var flag: String

    enum CodingKeys: String, CodingKey {
        case iso2, iso3
        case id = "_id"
        case lat, long, flag
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        iso2 = try container.decode(String.self, forKey: .iso2)
        iso3 = try container.decode(String.self, forKey: .iso3)
        id = try? container.decode(Int.self, forKey: .id)
        lat = try container.decode(Double.self, forKey: .lat)
        long = try container.decode(Double.self, forKey: .long)
        flag = try container.decode(String.self, forKey: .flag)
    }
}

Я также предпочел бы сделать любое свойство необязательным, чтобы API мог возвращать «НЕТ ДАННЫХ», поскольку я думаю, что nil более понятен и его легче обрабатывать позже.

...