(Swift) 如何解析有时包含特定字段的 JSON 响应?

(Swift) How to parse JSON response that sometimes contains a certain field?

我正在尝试解析一个 JSON 响应,该响应有时包含字段 'state',有时不包含。例如:

{
country: "US", 
lat: 69, 
lon: 69, 
name: "CityName",
state: "StateName"
}

对比

{
country: "US", 
lat: 69, 
lon: 69, 
name: "CityName"
}

我正在使用 Alamofire 对其进行解析,但是当 json 响应不包含 'state' 字段时,当然 运行 会出错。

      AF.request("API.COM").responseData(completionHandler: { response in
            guard let data = response.data else { return }
            let responses = try! JSONDecoder().decode([apiResponse].self, from: data)
            print(responses as Any)
            self.dispatchGroup.leave()
        })

其中:

struct apiResponse: Decodable {
    var country: String
    var lat: Float
    var lon: Float
    var name: String
    var state: String
}

我想为响应中的每个对象获取一个结构,无论它是否包含 'state' 字段。做这个的最好方式是什么?我尝试使用一些 do/catch 逻辑在解析对象时捕获错误,然后尝试使用没有状态字段的可解码结构来解析它,但这对我来说没有用。非常感谢您的帮助。

改变

struct apiResponse: Decodable {
    var country: String
    var lat: Float
    var lon: Float
    var name: String
    var state: String
}

作为

struct apiResponse: Decodable {
    var country: String
    var lat: Float
    var lon: Float
    var name: String
    var state: String?
}

您可以检查状态

if let _ = model.state {
}

对可选的 属性 使用 Optional,这就是它们的用途。即,

var state: String?

此外,还有一些不相关的提示:

  • 您可以将结构中的所有 var 更改为 let
  • 将其重命名为 ApiResponse(大写 A)- 输入 Swift 通常以大写字母开头。
  • 考虑使用 URLSessionCodable,而不是从外部库中添加成千上万行代码。