Разбор JSON с отсутствующим параметром - PullRequest
1 голос
/ 15 апреля 2019

Я получаю JSON с веб-страницы, где я получаю погоду для аэропорта, и пока все хорошо, она работает, но один из них

struct MetarResponse: Codable {

var windGust = Windgust

}

struct WindGust: Codable {
    var repr: String?
}

иногда, когда речь идет о JSON, я даю мне

"wind_gust":{"repr":"37","value":37,"spoken":"three seven"},

Но если это значение отсутствует в погоде, оно даст мне

"wind_gust": нулевой,

так что сейчас у меня проблема, что мне нужно только использовать значение repr, и это работает с имеющейся у меня структурой, но приложение вылетает, когда я получаю погоду в месте, где вместо этого содержится ноль.

Как предотвратить сбой при попытке проанализировать JSON?

рабочий код:

struct MetarResponse: Codable {

var windGust = Windgust?

}

struct WindGust: Codable {
    var repr: String?
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вам нужно сделать вашу WindGust структуру необязательной, что-то вроде

struct Weather: Codable {
    let windGust: WindGust?
}

Пример

let data = """
    {"wind_gust":null}
""".data(using: .utf8)!

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

do {
    let weather = try decoder.decode(Weather.self, from: data)
    print(weather.windGust)
} catch {
    print(error)
}
0 голосов
/ 15 апреля 2019

Что вы можете сделать, это проверить, получаете ли вы то, что вы хотите, и предоставить пользовательское значение, чтобы ваша система не зависала.Что-то вроде:

struct WindGust: Codable {
    var repr: String?

    enum CodingKeys: String, CodingKey {
        case repr
    }
}


extension WindGust: Decodable {

    init(from decoder: Decoder) throws {
        guard let repr = try decoder.container(keyedBy: CodingKeys.self) else {
             repr = "placeholder"
             return
        }
    }
}

Таким образом, вы можете управлять, когда ваши данные json не такие, как вы ожидаете, я не пробовал приведенный выше код, но, надеюсь, вы поймете идею.Я также рекомендую эту документацию Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...