如何为 API 响应创建快速模型,如果响应具有“键”,该“键”最初为零值但在一段时间后被数据类型填充

问题描述 投票:0回答:1

这是我在“状态”键值打开时来自邮递员的 API 响应

{
    "data": {
        "id": 247,
        "status": "open",
}
        "code": 1,
        "message": "Details fetched successfully."
}

这是当“状态”键值更改为“已完成”时来自同一 API 的 API 响应


{
    "data": {
        "id": 247,
         "status": “completed,
        "additional_data": {
            "id": 241,
            "booking_id": 247,
            "checklist_done": "{\"4\":\"Gear Oil\",\"2\":\"Engine Oil Change\"}",
            "work_with_price": "{}",
            "work_price": "0",
            "status": "pending"
      },
    
    "code": 1,
    "message": "Details fetched successfully."
}

因此,如果您查看上面的响应,则会将新键“additional_data”添加到响应中。当“状态”为“打开”时我面临的问题是什么我能够解码数据但是当“状态”更改为“完成”时我无法解码数据

这里是我试过的 这是我为解码 API 响应而创建的结构

struct ServicingModel: Codable {
    var data: DataClass?
    var code: Int?
    var message: String?
}


struct DataClass: Codable {
    var id: Int?
    var status: String?
    var additionalData: AdditionalData?

 enum CodingKeys: String, CodingKey {
        case id
        case status 
        case additionalData = "additional_data"
   }

init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            id = try values.decodeIfPresent(Int.self, forKey: .id)
            status = try values.decodeIfPresent(String.self, forKey: .status)

            if let additionalDataOpt = try values.decodeIfPresent(AdditionalData.self,        forKey: .additionalData) {
                additionalData = additionalDataOpt
            } else {
                additionalData = nil
            }
}

}

struct AdditionalData: Codable {
    var id, bookingID: Int?
    var checklistDone: String?
    var workWithPrice: String?
    var workPrice: String?
    var status: String?

enum CodingKeys: String, CodingKey {
        case id
        case bookingID = "booking_id"
        case checklistDone = "checklist_done"
        case workWithPrice = "work_with_price"
        case workPrice = "work_price"
        case status
}
}

通过使用上面的结构,我能够在状态打开时解码数据,但是当状态更改为完成时我无法解码数据,请指导我如何创建模型以获取额外数据以在添加 additional_data 键时映射 API 响应.

我在过去三天一直被这个问题所困扰,我们将不胜感激。感谢提前

ios json swift api structure
1个回答
0
投票

您共享的 JSON 不是有效的 JSON,但如果我回答正确,这应该对您有用。

// MARK: - MyModel
    struct MyModel: Codable {
        let data: DataClass?
        let code: Int?
        let message: String?
    }
    
    // MARK: - DataClass
    struct DataClass: Codable {
        let id: Int?
        let status: String?
        let additionalData: AdditionalData?
    
        enum CodingKeys: String, CodingKey {
            case id, status
            case additionalData = "additional_data"
        }
    }
    
    // MARK: - AdditionalData
    struct AdditionalData: Codable {
        let id, bookingID: Int?
        let checklistDone, workWithPrice, workPrice, status: String?
    
        enum CodingKeys: String, CodingKey {
            case id
            case bookingID = "booking_id"
            case checklistDone = "checklist_done"
            case workWithPrice = "work_with_price"
            case workPrice = "work_price"
            case status
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.