【发布时间】:2020-12-31 13:22:41
【问题描述】:
我正在尝试根据编码数据的内容解码特定类。
class Vehicle: Codable {
enum Kind: Int, Codable {
case car = 0, motorcycle = 1
}
let brand: String
let numberOfWheels: Int
}
class Car: Vehicle {}
class MotorCycle: Vehicle {}
如您所见,我有一个通用的Vehicle 类型,用于对车辆进行编码和解码。这适用于如下所示的基本解码。
let car = "{\"kind\": 0, \"brand\": \"Ford\", \"number_of_wheels\": 4}".data(using: .utf8)!
let motorCycle = "{\"kind\": 1, \"brand\": \"Yamaha\", \"number_of_wheels\": 2}".data(using: .utf8)!
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
// Outputs a Project.Car
let ford = try! decoder.decode(Car.self, from: car)
// Outputs a Project.MotorCycle
let yamaha = try! decoder.decode(MotorCycle.self, from: motorCycle)
但是,如果我想解码一组车辆,但将它们解码为特定类型,该怎么办?
let combined = "[{\"kind\": 0, \"brand\": \"Ford\", \"number_of_wheels\": 4}, {\"kind\": 1, \"brand\": \"Yamaha\", \"number_of_wheels\": 2}]".data(using: .utf8)!
// Outputs [Project.Vehicle, Project.Vehicle]
print(try! decoder.decode([Vehicle].self, from: combined))
如何使用 JSON 数据中的 kind 属性让解码器输出一组车辆,但输入车辆类型。如果可能的话,按照示例[Project.Car, Project.MotorCycle]。
【问题讨论】:
-
也许是挑剔,但 Vehicle 不是通用类而是超类
-
是的,我的错。确实是超类
-
IMO 你应该直接删除子类,除非你有很好的理由这样做。
标签: json swift decoding codable