【发布时间】:2018-12-27 06:58:53
【问题描述】:
如何在 swift 中将 json 解码为通用模型?
在java中解码json我使用GSON,一般来说我使用<T<E>> or ArrayList<E>没关系。在swift中数组是一个结构,不能继承,它还没有实现可解码。
我正在寻找一个通用的优雅类,用于我的所有网络服务。
我的场景:
我有 json 响应
{
"status": true,
"message": "",
"code": 200,
"response": [{
"id": 43
}]
}
还有一个来自网络服务的通用响应模型:
class GeneralResponse< T : Decodable >:NSObject,Decodable{
var status = false
var message = ""
var code = -1
var response : T?
private enum CodingKeys: String, CodingKey {
case status
case message
case code
case response
}
required public init(from decoder: Decoder) throws{
let container = try decoder.container(keyedBy: CodingKeys.self)
status = try container.decode(Bool.self, forKey: .status)
message = try container.decode(String.self, forKey: .message)
code = try container.decode(Int.self, forKey: .code)
response = try container.decode(T.self, forKey: .response)
}
}
class ItemDemoModel:Decodable {
var id = -1
private enum ItemDemModelCodingKeys : String, CodingKey {
case id
}
required init(from decoder:Decoder) throws {
let container = try decoder.container(keyedBy: ItemDemModelCodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
}
}
响应变量可以是 ItemDemoModel 或 ItemDemoModel 数组。
例如:
可以是GeneralResponse<Array<ItemDemoModel>>>
或GeneralResponse<ItemDemoModel>>
谢谢。
【问题讨论】:
-
附带说明,如果您确实不需要从
NSObject继承,请不要从它继承。在 Swift 中,您不需要为您定义的任何类从NSObject子类化。 -
@nayem 先生,我尝试扩展 Array 以实现可解码。但是 Array 是结构体,不能扩展。
标签: json swift generics response decode