在 Swift 中使用 nil 值解析 JSON

Posted

技术标签:

【中文标题】在 Swift 中使用 nil 值解析 JSON【英文标题】:Parsing JSON in Swift with nil values 【发布时间】:2020-04-23 21:10:57 【问题描述】:

我正在使用 Swift 5 和 Xcode 11。我正在尝试解析从该网站返回的 JSON,这是我正在设计的 API。 http://aarontcraig-001-site1.htempurl.com/api/values

从该 API 调用返回的 JSON 如下:

[
    
        "Businesses": [],
        "Customer": null,
        "ID": 1,
        "Name": "Coffee Shop",
        "CustomerID": null
    ,
...
]

它继续一个数组。有些条目是空的,有些则不是。但是,当我解析它时,它们都返回 nil。

这是我的代码:

let url = "http://aarontcraig-001-site1.htempurl.com/api/values"
        guard let finalURL = URL(string: url) else 
            return
        

        URLSession.shared.dataTask(with: finalURL)  (data, response, error) in
            guard let data = data else return

            do 
                let myData = try JSONDecoder().decode([Value].self, from: data)

                print(myData)
            
            catch 
                print("Error parsing \(error)")
            

以及我用来捕捉这一切的结构:

struct Value: Codable 
    let businesses : [String]?
    let customer : String?
    let iD : Int?
    let name : String?
    let customerID : String?

我得到的只是 nil 值,尽管其中很多显然不是。这就是它返回的内容。

[Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID: nil), Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID : nil), Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID: nil), Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID : nil), Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID: nil), Sunrise.Value(businesses: nil, customer: nil, iD: nil, name: nil, customerID :无)]

我做错了什么?即使我尝试仅捕获每个条目都有值的名称,它也会将其设置为 nil。我正在接收数据,因为如果我在数据处设置断点,我可以在那里看到它。

【问题讨论】:

键不匹配。 “客户 ID”!=“客户 ID”。不要让它们成为可选的,你会看到的。我认为id 不应该永远为零(我希望模型)。见***.com/questions/44396500/… 这能回答你的问题吗? How do I use custom keys with Swift 4's Decodable protocol? 【参考方案1】:

使用 CodingKeys 将 JSON 中的属性名称映射到结构的成员:

struct Value: Codable 
    let businesses: [String]?
    let customer: String?
    let id: Int
    let name: String
    let customerID: String?

    enum CodingKeys: String, CodingKey 
        case businesses = "Businesses"
        case customer = "Customer"
        case id = "ID"
        case name = "Name"
        case customerID = "CustomerID"
    

【讨论】:

以上是关于在 Swift 中使用 nil 值解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中将 JSON `null` 值传递给`nil` 值?

使用 Alamofire 快速解析 JSON 时获取 nil 值

使用 swift 从解析的 Json 中提取数据

解析后JSON结果为零

变量不断返回 nil - Swift iOS

解析 json 数组在 swift 中返回空元素