(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?

还有一些不相关的提示:

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

【讨论】:

以上是关于(Swift)如何解析有时包含某个字段的 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:解析 JSON,NSDictionary 的 NSDictionary

使用swift解析包含索引的json数据?

mysql数据库中某个字段存的是json数据,如何对json数据中的数据进行操作?

如何从函数内部获取 JSON 数据并将其快速显示在文本字段上?

当对象包含其他对象数组时如何解析 JSON?

获得 json 响应后,Swift 4 UI 卡住了