使用 Codable 转换为对象
Casting to object with Codable
我所有的 JSON 回复都遵循相同的结构:
"success": <http code>,
"data": [
]
发回的 data
可能会有所不同。有时它可以包含 User
s,有时 Comment
s 等。所以我想创建一个 Codable struct
可以灵活地处理在 [= 中发回的各种类型的对象13=]数组。
这是我现在的 struct
:
struct BasicResponse: Codable {
let success: Int
let data: [User]
}
如您所见,它目前仅处理 User
发回的数据。
然后,我这样读取JSON数据(通过Alamofire/Moya):
var users = [User]()
let results = try JSONDecoder().decode(BasicResponse.self, from: response.data)
self.users.append(contentsOf: results.data)
如何更改我的 struct
文件以使其更灵活,然后如何将 JSON 响应投射到所需的对象?
因此,我会考虑尝试 Swift 的通用支持,例如...Swift,而无需经历大量的设计周期和直接的想法...
struct BasicResponse<DataType>: Codable where DataType: Codable {
let success: Int
let data: [DataType]
}
然后你只需要定义你想要使用的DataType
s的实现
struct User: Codable {
var name: String
}
并解码...
let decoder = JSONDecoder()
let response = try decoder.decode(BasicResponse<User>.self, from: data)
print(response.data[0].name)
现在,我只是将其放入 Playground 并使用一些基本数据对其进行了测试...
struct User: Codable {
var name: String
}
struct BasicResponse<T>: Codable where T: Codable {
let success: Int
let data: [T]
}
let data = "{\"success\": 200, \"data\": [ { \"name\":\"hello\" }]}".data(using: .utf8)!
let decoder = JSONDecoder()
do {
let response = try decoder.decode(BasicResponse<User>.self, from: data)
response.data[0].name
} catch let error {
print(error)
}
您可能需要 "massage" 设计以更好地满足您的需求,但它可能会给您一个起点
我所有的 JSON 回复都遵循相同的结构:
"success": <http code>,
"data": [
]
发回的 data
可能会有所不同。有时它可以包含 User
s,有时 Comment
s 等。所以我想创建一个 Codable struct
可以灵活地处理在 [= 中发回的各种类型的对象13=]数组。
这是我现在的 struct
:
struct BasicResponse: Codable {
let success: Int
let data: [User]
}
如您所见,它目前仅处理 User
发回的数据。
然后,我这样读取JSON数据(通过Alamofire/Moya):
var users = [User]()
let results = try JSONDecoder().decode(BasicResponse.self, from: response.data)
self.users.append(contentsOf: results.data)
如何更改我的 struct
文件以使其更灵活,然后如何将 JSON 响应投射到所需的对象?
因此,我会考虑尝试 Swift 的通用支持,例如...Swift,而无需经历大量的设计周期和直接的想法...
struct BasicResponse<DataType>: Codable where DataType: Codable {
let success: Int
let data: [DataType]
}
然后你只需要定义你想要使用的DataType
s的实现
struct User: Codable {
var name: String
}
并解码...
let decoder = JSONDecoder()
let response = try decoder.decode(BasicResponse<User>.self, from: data)
print(response.data[0].name)
现在,我只是将其放入 Playground 并使用一些基本数据对其进行了测试...
struct User: Codable {
var name: String
}
struct BasicResponse<T>: Codable where T: Codable {
let success: Int
let data: [T]
}
let data = "{\"success\": 200, \"data\": [ { \"name\":\"hello\" }]}".data(using: .utf8)!
let decoder = JSONDecoder()
do {
let response = try decoder.decode(BasicResponse<User>.self, from: data)
response.data[0].name
} catch let error {
print(error)
}
您可能需要 "massage" 设计以更好地满足您的需求,但它可能会给您一个起点