首页 > 解决方案 > 在 Swift 中从包含数字和连字符的 JSON 数据创建解码路径?

问题描述

这对我来说相对较新,我搜索过高低,但未能找到类似的场景。

我已经从 API URL 中检索了一些 JSON 数据,并通过将数据解析到单独的工作表并使用带有“Decodable”值集的结构和常量,成功地解码了这些数据中的各种值并将其输出为字符串。我遇到的问题是 Json 数据中的一个容器是这种格式的连字符日期 dates['2020-11-04'] 所以swift不会让我创建一个具有这个名称的结构(这也看起来像一个数组但在 Web 浏览器中查看未格式化的 JSON 数据时没有方括号)。

这是我想要作为字符串输出的日期的完整路径以及正在使用的 URL(使用 JSON Viewer Pro 从 Web 浏览器复制):

日期['2020-11-04'].countries.Afghanistan.date

https://api.covid19tracking.narrativa.com/api/2020-11-04

这是包含我的结构和常量以解码数据的工作表:

import Foundation

//I understand the below name will not work but i've included it to show my presumed process
struct CovidData: Decodable {
    let dates: dates[2020-11-04]
}

//Once again the below struct name does not work but i've included it as an example of my presumed process.
struct dates[2020-11-04]: Decodable {
    let countries: countries
}

struct countries: Decodable {
    let Afghanistan: Afghanistan
}
struct Afghanistan: Decodable {
    let date: String
}

这是我的 API 调用和 JSON Parse 的管理表:

import Foundation

protocol CovidDataManagerDelegate {
    func didUpdateCovidData(_ covidDataManager: CovidDataManager, covid: CovidModel)
}

struct CovidDataManager {
    
    var delegate: CovidDataManagerDelegate?
    
    let covidURL = "https://api.covid19tracking.narrativa.com/api/2020-11-04"
    
    func getData() {
        let urlString  = covidURL
        performRequest(with:urlString)
        
    }
    
    func performRequest(with urlString: String){
        
        if let url = URL(string: urlString){
            
            let session = URLSession(configuration: .default)
            
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil {
                    print("Error")
                    return
                }
                if let safeData = data {
                    if let covid = parseJSON(safeData){
                    self.delegate?.didUpdateCovidData(self, covid: covid)
                    }
                }
            }
            task.resume()
        }
        
        func parseJSON(_ covidData: Data) -> CovidModel?  {
            let decoder = JSONDecoder()
            do {
                let decodedData = try decoder.decode(CovidData.self, from: covidData)
                let date = decodedData.dates['2020-11-04'].countries.Afghanistan.date
                let covid = CovidModel(date: date)
                print(date)
                return covid
            } catch {
                print("Error with JSON Parse")
                return nil
            }
        }
    }

}

如前所述,我没有包括我的 UI 更新表,调用和解码在使用完全由字符串组成的 JSON 路径解码数据时工作得非常好,它只是这个容器,带有额外的符号和数字,我很难过。

如果某些术语不准确,希望我已经提供了足够的信息并道歉,这对我来说还是很新的。

谢谢!

标签: jsonswiftstructdecodelet

解决方案


推荐阅读