我从网页上获取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?
}
答案 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文档。