Arrays 如何使用Swift Decodable自定义解码数组的每个元素
我正在解码一个weather JSON响应,我想将信息传递给一个子解码器,该子解码器将解码一个数组。在使用Swift Decodable进行解码时,如何为每个JSON数组元素传递此信息 我正在尝试在最新的Swift版本4.2中执行上述操作,并且我已经实现了必要的代码,以成功自定义解码阵列中使用的相同模型。我无法解码整个阵列Arrays 如何使用Swift Decodable自定义解码数组的每个元素,arrays,swift,decodable,Arrays,Swift,Decodable,我正在解码一个weather JSON响应,我想将信息传递给一个子解码器,该子解码器将解码一个数组。在使用Swift Decodable进行解码时,如何为每个JSON数组元素传递此信息 我正在尝试在最新的Swift版本4.2中执行上述操作,并且我已经实现了必要的代码,以成功自定义解码阵列中使用的相同模型。我无法解码整个阵列 struct DataBlock: Decodable { /.. let weather: [DataPoint]? init(from deco
struct DataBlock: Decodable {
/..
let weather: [DataPoint]?
init(from decoder: Decoder) throws {
try self.init(from: decoder, units: .unit)
}
init(from decoder: Decoder, units: Units) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
/..
let nestedDecoder = try values.superDecoder(forKey: .weather)
self.weather = try [DataPoint(from: nestedDecoder, units: units)]
}
enum CodingKeys: String, CodingKey {
/..
case weather
}
}
在数据点模型中:
init(from decoder: Decoder, units: Units) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
/...
if let value = try values.decodeIfPresent(Double.self, forKey: .value) {
self.value = Example(value: value, units: units)
} else {
self.value = nil
}
/..
}
我试图解码的JSON结构的相关部分:
"datablock": {
"weather": [
{
/..
"value": 22.72
/..
}
]
}
我希望解码器能通过
units
并手动解码每个数组元素
但是,我得到一个调试错误:
"Expected to decode Dictionary<String, Any> but found an array instead."
这解决了我的问题,让我“演练”每个JSON数组元素并分别解码:
struct DataBlock: Decodable {
/..
init(from decoder: Decoder, units: Units) throws {
/..
var data = [DataPoint]()
var dataContainer = try values.nestedUnkeyedContainer(forKey: .data)
while !dataContainer.isAtEnd {
let nestedDecoder = try dataContainer.superDecoder()
let dataPoint = try DataPoint(from: nestedDecoder, units: units)
data.append(dataPoint)
}
self.data = data
/..
}
/..
}
你能展示一下你要解码的JSON吗?哎呀,我刚刚添加了JSON部分!抛出的错误在哪里?您可以发布用于获取JSON响应的url吗?或者指向接收到json数据的文件的链接?澄清了引发错误的行
struct DataBlock: Decodable {
/..
init(from decoder: Decoder, units: Units) throws {
/..
var data = [DataPoint]()
var dataContainer = try values.nestedUnkeyedContainer(forKey: .data)
while !dataContainer.isAtEnd {
let nestedDecoder = try dataContainer.superDecoder()
let dataPoint = try DataPoint(from: nestedDecoder, units: units)
data.append(dataPoint)
}
self.data = data
/..
}
/..
}