从Swift中包含数字和连字符的JSON数据创建解码路径?
这对我来说是相对较新的,我已经到处搜索,但没有找到类似的场景 我从一个API URL中检索了一些JSON数据,并通过将数据解析到一个单独的表中,并使用带有“可解码”值集的结构和常量,成功地将这些数据中的各种值解码并输出为字符串。我遇到的问题是,Json数据中的一个容器是一个连字符的日期,格式为dates['2020-11-04'],因此swift不允许我使用此名称创建结构(这看起来也像一个数组,但在web浏览器中查看未格式化的Json数据时没有方括号) 以下是我希望输出为字符串的日期的完整路径和所使用的URL(使用JSON Viewer Pro从web浏览器复制): 日期['2020-11-04']。国家。阿富汗。日期 以下是包含用于解码数据的结构和常量的工作表:从Swift中包含数字和连字符的JSON数据创建解码路径?,json,swift,struct,decode,let,Json,Swift,Struct,Decode,Let,这对我来说是相对较新的,我已经到处搜索,但没有找到类似的场景 我从一个API URL中检索了一些JSON数据,并通过将数据解析到一个单独的表中,并使用带有“可解码”值集的结构和常量,成功地将这些数据中的各种值解码并输出为字符串。我遇到的问题是,Json数据中的一个容器是一个连字符的日期,格式为dates['2020-11-04'],因此swift不允许我使用此名称创建结构(这看起来也像一个数组,但在web浏览器中查看未格式化的Json数据时没有方括号) 以下是我希望输出为字符串的日期的完整路径和
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解析:
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路径解码数据时,调用和解码工作非常好。这是唯一一个包含额外符号和数字的容器
希望我已经提供了足够的信息,如果其中一些术语不准确,我表示歉意,这对我来说还是很新鲜的
谢谢 我不知道您的“JSON查看器专业版”,但很明显,JSON
'2020-11-04'
中没有任何内容。现在还不清楚为什么你真的想要那个“
字符。你不该这么做。此外,您可能想跳过它。与那里的解决方案(用户建议)相同。不幸的是,web浏览器中的结构是“日期>2020-11-04>国家>阿富汗”,我找到的所有解决方案都有示例代码,其中结构(或常量)的名称是文本字符串,而我需要访问的数据路径有数字和连字符。如果我可以跳过这个容器,那将很有帮助,但我不知道如何从链接中做到这一点。不,没有“连字符日期”,这可能只是在JSON View Pro中,而不是在现实中。因此,我的解码结构应该遵循以下路径。。。。struct CovidData:Decodable{let dates:dates}struct dates:Decodable{let countries:countries}struct countries:Decodable{let Afghanistan:Afghanistan}struct Afghanistan:Decodable{let date:String}这是在web浏览器中不使用JSON查看器的数据,路径中似乎有日期,在swift中忽略这一点似乎对我仍然不起作用。{“日期”:{“2020-11-04”:{“国家”:{“阿富汗”:{“日期”:“2020-11-04”,“id”:“阿富汗”,“链接”:[{“href”:“/api/2020-11-