(Swift)如何解析有时包含某个字段的 JSON 响应?
Posted
技术标签:
【中文标题】(Swift)如何解析有时包含某个字段的 JSON 响应?【英文标题】:(Swift) How to parse JSON response that sometimes contains a certain field? 【发布时间】:2021-04-03 20:45:52 【问题描述】:我正在尝试解析有时包含字段“状态”而有时不包含的 JSON 响应。例如:
country: "US",
lat: 69,
lon: 69,
name: "CityName",
state: "StateName"
对比
country: "US",
lat: 69,
lon: 69,
name: "CityName"
我正在使用 Alamofire 来解析它,但是当 json 响应不包含“状态”字段时,当然会遇到错误。
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
我想为响应中的每个对象获取一个结构,无论它是否包含“状态”字段。做这个的最好方式是什么?我尝试在解析对象时使用一些 do/catch 逻辑来捕获错误,然后尝试使用没有状态字段的可解码结构来解析它,但这对我来说不起作用。非常感谢您的帮助。
【问题讨论】:
您可以使用responseDecodable(of: [APIResponse.self])
直接解码您的模型。键入重命名的 APIResponse
以匹配 Swift 的命名准则。
【参考方案1】:
改变
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
【讨论】:
【参考方案2】:使用Optional
作为可选属性,这就是它们的用途。即,
var state: String?
还有一些不相关的提示:
您可以将结构中的所有var
s 更改为let
s
将其重命名为ApiResponse
(大写A)- Swift 中的类型
通常以大写字母开头。
考虑使用URLSession
和Codable
,而不是从外部库添加成千上万行代码。
【讨论】:
以上是关于(Swift)如何解析有时包含某个字段的 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章
Swift:解析 JSON,NSDictionary 的 NSDictionary
mysql数据库中某个字段存的是json数据,如何对json数据中的数据进行操作?