如何在swift中将json解码为通用模型?
在java中,我使用GSON来解码json,一般情况下,我使用<T<E>> or ArrayList<E>
。在swift中,Array是一个结构体,不能继承,也没有实现Decodable。
我正在寻找一个通用的优雅的类在我所有的Web服务使用。
我的场景:
我有json响应
{
"status": true,
"message": "",
"code": 200,
"response": [{
"id": 43
}]
}
和一个通用的响应模型,像这样的Web服务:
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>>
谢谢。
4条答案
按热度按时间k97glaaz1#
如果你声明了一个
Decodable
属性和json
中的键同名,那么你并不需要一个enum
来定义Coding
键,也不需要一个初始化器来手动Map每个属性和键。此外,在
Swift
中没有必要继承NSObject
,直到有了特定的用例。查看声明,似乎没有必要,因此可以像这样简单地重新声明GeneralResponse
,类似地,
ItemDemoModel
可以这样声明:现在您可以设置您的服务如下,以获得
GeneralResponse<T>
的任何请求,用法
你必须使用下面的方法来声明数组和字典
但是使用
Swift
的类型推断,可以像下面这样简单地声明array
和dictionary
,ercv8c1e2#
这里有一个你可能想用来解码JSON的函数:
所以你可以像这样调用你的函数:
希望能帮到你:D
hrysbysz3#
如果
T
符合Decodable
,则Array<T>
符合Decodable
,因此GeneralResponse<[ItemDemoModel]>
不会产生任何错误。如下所示:
您可以简单地这样做:
umuewwlo4#
如果你在json中声明了一个Decodable属性,并且和key同名,那么你并不需要一个枚举来定义Coding key,也不需要一个初始化器来手动Map每个属性和key。
此外,在Swift中没有必要从NSObject继承,直到你有一个特定的用例。查看声明,似乎没有必要,因此您的GeneralResponse可以像这样简单地重新声明,
struct ResponseModel<T: Decodable>:Decodable {
}
如果您使用的键与响应不同
struct ResponseModel<T: Decodable>:Decodable {
enum CodingKeys:String,String {
}