使用 Codable 转换为对象

Casting to object with Codable

我所有的 JSON 回复都遵循相同的结构:

"success": <http code>,
"data": [

]

发回的 data 可能会有所不同。有时它可以包含 Users,有时 Comments 等。所以我想创建一个 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]
}

然后你只需要定义你想要使用的DataTypes的实现

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" 设计以更好地满足您的需求,但它可能会给您一个起点