我如何使用 codable 解码字典数组
How do i decode an array of dictioniaries using codable
我正在尝试调用具有字典数组的 API:我收到以下错误,但不确定如何修复。这是我的结构模型
struct Countries : Codable {
var countries : [Country]
}
struct Country : Codable {
var Country : String
var NewConfirmed : Int
var TotalConfirmed : Int
var NewDeaths : Int
var TotalDeaths : Int
var NewRecovered : Int
var TotalRecovered : Int
var CountryCode : String
}
这是我的网络代码:
class Networking {
func response (url: String , completion: @escaping (Countries) -> ()) {
guard let url = URL(string: url) else {return}
URLSession.shared.dataTask(with: url, completionHandler: { (data , response , error ) in
self.urlCompletionHandler(data: data, response: response, error: error, completion: completion)
}).resume()
}
func urlCompletionHandler (data: Data? , response : URLResponse? , error : Error? , completion: (Countries) -> ()) {
guard let data = data else {return}
do {
let jsondecoder = JSONDecoder()
let countries = try jsondecoder.decode(Countries.self, from: data)
completion(countries)
} catch {
print("Error \(error)")
}
}
}
这是我在控制器中的调用:
func response () {
newtorkhanler.response(url: UrlPathSingleTon.urlsingleton.shared()) { (countried : (Countries)) in
self.countrizs = countried.countries
DispatchQueue.main.async {
self.tableview.reloadData()
}
}
我想填充一个 Country 数组,我将它作为 Countries 结构中的数组变量。我的计划是解码 Countries 并使用我命名为 countries 的 Country 数组变量,并在响应函数中设置为 Country 的 countrizs
数组。我收到此错误,该错误特定于 Countries 结构中的 countries 变量:
Error keyNotFound(CodingKeys(stringValue: "countries", intValue:
nil), Swift.DecodingError.Context(codingPath: [], debugDescription:
"No value associated with key CodingKeys(stringValue: \"countries\",
intValue: nil) (\"countries\").", underlyingError: nil))
这是API json格式:数组JSON数据在附图中:
{
"Countries": [
{
"Country": "Afghanistan",
"CountryCode": "AF",
"Slug": "afghanistan",
"NewConfirmed": 787,
"TotalConfirmed": 18054,
"NewDeaths": 6,
"TotalDeaths": 300,
"NewRecovered": 63,
"TotalRecovered": 1585,
"Date": "2020-06-05T17:51:15Z"
},
{
"Country": "Albania",
"CountryCode": "AL",
"Slug": "albania",
"NewConfirmed": 13,
"TotalConfirmed": 1197,
"NewDeaths": 0,
"TotalDeaths": 33,
"NewRecovered": 0,
"TotalRecovered": 898,
"Date": "2020-06-05T17:51:15Z"
}
]
}
要解决此问题,您需要将 属性 从 countries
修改为 Countries
。您的密钥应与 JSON
.
中的密钥匹配
struct Countries : Codable {
var Countries : [Country]
}
或者您可以像这样使 属性 名称小写并且结构大写 Swift 样式:
struct Countries : Codable {
var countries : [Country]
enum CodingKeys: String, CodingKey {
case countries = "Countries"
}
}
如果您的 var 名称与 json 中键的名称不同,您可以明确定义编码键以便它们匹配(否则,当所有属性都已经 Decodable
时,您的将合成编码密钥)。
struct Countries : Codable {
var countries : [Country]
enum CodingKeys: String, CodingKey {
case countries = "Countries"
}
}
请注意,您的案例必须与您尝试解码的变量名称相匹配。编译器将强制执行此操作,并且您的对象将不符合 Decodable
(或 Encodable),而您的 CodingKeys
枚举中的属性不匹配大小写。
这样,您就可以保持您的命名约定。
我正在尝试调用具有字典数组的 API:我收到以下错误,但不确定如何修复。这是我的结构模型
struct Countries : Codable {
var countries : [Country]
}
struct Country : Codable {
var Country : String
var NewConfirmed : Int
var TotalConfirmed : Int
var NewDeaths : Int
var TotalDeaths : Int
var NewRecovered : Int
var TotalRecovered : Int
var CountryCode : String
}
这是我的网络代码:
class Networking {
func response (url: String , completion: @escaping (Countries) -> ()) {
guard let url = URL(string: url) else {return}
URLSession.shared.dataTask(with: url, completionHandler: { (data , response , error ) in
self.urlCompletionHandler(data: data, response: response, error: error, completion: completion)
}).resume()
}
func urlCompletionHandler (data: Data? , response : URLResponse? , error : Error? , completion: (Countries) -> ()) {
guard let data = data else {return}
do {
let jsondecoder = JSONDecoder()
let countries = try jsondecoder.decode(Countries.self, from: data)
completion(countries)
} catch {
print("Error \(error)")
}
}
}
这是我在控制器中的调用:
func response () {
newtorkhanler.response(url: UrlPathSingleTon.urlsingleton.shared()) { (countried : (Countries)) in
self.countrizs = countried.countries
DispatchQueue.main.async {
self.tableview.reloadData()
}
}
我想填充一个 Country 数组,我将它作为 Countries 结构中的数组变量。我的计划是解码 Countries 并使用我命名为 countries 的 Country 数组变量,并在响应函数中设置为 Country 的 countrizs
数组。我收到此错误,该错误特定于 Countries 结构中的 countries 变量:
Error keyNotFound(CodingKeys(stringValue: "countries", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"countries\", intValue: nil) (\"countries\").", underlyingError: nil))
这是API json格式:数组JSON数据在附图中:
{
"Countries": [
{
"Country": "Afghanistan",
"CountryCode": "AF",
"Slug": "afghanistan",
"NewConfirmed": 787,
"TotalConfirmed": 18054,
"NewDeaths": 6,
"TotalDeaths": 300,
"NewRecovered": 63,
"TotalRecovered": 1585,
"Date": "2020-06-05T17:51:15Z"
},
{
"Country": "Albania",
"CountryCode": "AL",
"Slug": "albania",
"NewConfirmed": 13,
"TotalConfirmed": 1197,
"NewDeaths": 0,
"TotalDeaths": 33,
"NewRecovered": 0,
"TotalRecovered": 898,
"Date": "2020-06-05T17:51:15Z"
}
]
}
要解决此问题,您需要将 属性 从 countries
修改为 Countries
。您的密钥应与 JSON
.
struct Countries : Codable {
var Countries : [Country]
}
或者您可以像这样使 属性 名称小写并且结构大写 Swift 样式:
struct Countries : Codable {
var countries : [Country]
enum CodingKeys: String, CodingKey {
case countries = "Countries"
}
}
如果您的 var 名称与 json 中键的名称不同,您可以明确定义编码键以便它们匹配(否则,当所有属性都已经 Decodable
时,您的将合成编码密钥)。
struct Countries : Codable {
var countries : [Country]
enum CodingKeys: String, CodingKey {
case countries = "Countries"
}
}
请注意,您的案例必须与您尝试解码的变量名称相匹配。编译器将强制执行此操作,并且您的对象将不符合 Decodable
(或 Encodable),而您的 CodingKeys
枚举中的属性不匹配大小写。
这样,您就可以保持您的命名约定。