(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
通常以大写字母开头。
- 考虑使用
URLSession
和 Codable
,而不是从外部库中添加成千上万行代码。
我正在尝试解析一个 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 通常以大写字母开头。 - 考虑使用
URLSession
和Codable
,而不是从外部库中添加成千上万行代码。