解析缺少参数的JSON

时间:2019-04-15 12:26:08

标签: json swift struct

我从网页上获取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值,并且可以与我拥有的Struct一起使用,但是当我在一个包含null的地方获取天气时,它将使应用程序崩溃。

当我尝试解析JSON时如何防止其崩溃?

工作代码:

struct MetarResponse: Codable {

var windGust = Windgust?

}

struct WindGust: Codable {
    var repr: String?
}

2 个答案:

答案 0 :(得分:1)

您需要将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)
}

答案 1 :(得分:0)

您可以做的是检查您是否正在获取想要的并提供自定义值,以免系统崩溃。像这样:

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提供this文档。