我有一堂课,确认Codable
如下。
class ProductListAPIResponse : Codable {
let success : Bool?
let message : String?
let data : [Product]?
let errors : [String:String]?
private enum CodingKeys: String, CodingKey {
case success = "success"
case message = "message"
case data = "data"
case errors = "errors"
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
success = try values.decodeIfPresent(Bool.self, forKey: .success)
message = try values.decodeIfPresent(String.self, forKey: .message)
data = try values.decodeIfPresent([Product].self, forKey: .data)
errors = try values.decodeIfPresent(Dictionary.self, forKey: .errors)
}
}
它运行良好,在JSON解析中没有问题。由于我的项目中有大约70个API,因此决定做一些可重用性。我写的代码如下。
class APIResponse : Codable {
let success : Bool?
let message : String?
// let data : [Product]?
let errors : [String:String]?
private enum CodingKeys: String, CodingKey {
case success = "success"
case message = "message"
// case data = "data"
case errors = "errors"
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
success = try values.decodeIfPresent(Bool.self, forKey: .success)
message = try values.decodeIfPresent(String.self, forKey: .message)
// data = try values.decodeIfPresent([Product].self, forKey: .data)
errors = try values.decodeIfPresent(Dictionary.self, forKey: .errors)
}
}
class ProductListAPIResponse : APIResponse {
var data : [Product]?
private enum CodingKeys: String, CodingKey {
case data = "data"
}
required init(from decoder: Decoder) throws {
let containter = try decoder.container(keyedBy: CodingKeys.self)
data = try containter.decodeIfPresent([Product].self, forKey: .data)
// let superDecoder = try containter.superDecoder()
try super.init(from: decoder)
}
}
现在工作正常。 感谢@vadian
在这种情况下,出现解码器错误,如下所示:
valueNotFound(Swift.KeyedDecodingContainer<Project.APIResponse.(unknown context at $106f478d0).CodingKeys>,
Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "super", intValue: nil)], debugDescription: "Cannot get keyed decoding
container -- found null value instead.", underlyingError: nil))
注意:我必须在 Product
对象中执行与继承我列表中的基本数据相同的继承,而在Product Detail API上我收到相同的数据以及通过继承可以实现的更多详细信息。