Swift Динамически выбирает Codable struct для JSON значения поля в зависимости от типа ответа - PullRequest
0 голосов
/ 13 марта 2020

Я использую кодируемую структуру для обработки ответа API JSON. Структура данных в одном из полей (slideData_ варьируется в зависимости от типа карты, к которой относится ответ (cardType).

Поэтому мне нужно сделать простое условие в структуре, которое устанавливает значение slideData равным либо ApiCompanyProfileCardData, либо ApiPersonalProfileCardData, основанный на значении, возвращаемом в поле cardType. Я искал довольно долгое время, и я считаю, что enum и CodingKeys, вероятно, способ до go, но я застрял, пытаясь реализовать это. хотя это должно быть довольно просто. Может кто-нибудь помочь, пожалуйста?

{"card": 
    [
    {"cardTitle": "Title 1", 
    "cardType": "companyprofile", 
    "cardTypeDesc": "Company profile", 
    "id": 10, 
    "imageFile": "b443709ca8d8a269ca185381bfa2ad8326af33c3.png", 
    "slideData": {"cp_name": "Full Name", 
                  "cp_name_font_style": "'Nunito', sans-serif", 
                  "cp_name_font_weight": "900", 
                  "cp_name_size_quantity": "30px", 
                  "cp_name_text_color": "ff0000", 
                  "cp_title": "CEO", 
                  "cp_title_font_style": "Arial", 
                  "cp_title_font_weight": "normal", 
                  "cp_title_size_quantity": "20px", 
                  "cp_title_text_color": "000000"}
                  }
     ]
}

struct ApiCardData: Codable {

    let card: [Card]

    struct Card : Codable {
        let cardTitle: String
        let cardType: String
        let id: Int
        let imageFile: String
        let slideData: ApiCompanyProfileCardData
    }

    struct ApiCompanyProfileCardData: Codable {
        let cpName: String
        let cpNameFontStyle: String
        let cpNameFontWeight: String
        let cpNameSizeQuantity: String
        let cpNameTextColor: String
        let cpTitle: String
        let cpTitleFontStyle: String
        let cpTitleFontWeight: String
        let cpTitleSizeQuantity: String
        let cpTitleTextColor: String
    }

    struct ApiPersonalProfileCardData: Codable {
        let ppEmail: String
        let ppEmailFontStyle: String
        let ppEmailFontWeight: String
        let ppEmailSizeQuantity: String
        let ppEmailTextColor: String
        let ppName: String
        let ppNameFontStyle: String
        let ppNameFontWeight: String
        let ppNameSizeQuantity: String
        let ppNameTextColor: String
    }

}

1 Ответ

0 голосов
/ 13 марта 2020

@N.Widds Тогда вы можете сформировать свою структуру, как показано ниже, надеюсь, она вам поможет.

    struct ApiCardData: Codable {

    let card: [Card]

    struct Card : Codable {
        let cardTitle: String
        let cardType: String
        let id: Int
        let imageFile: String
        let slideData: ApiCompanyProfileCardData?
        let slideApiPersonalProfileData: ApiPersonalProfileCardData?

    }

struct ApiCompanyProfileCardData: Codable {
    let cpName: String
    let cpNameFontStyle: String

    enum CodingKeys: String, CodingKey {

        case cpName = "cp_name"
        case cpNameFontStyle = "cp_name_font_style"
    }

}

struct ApiPersonalProfileCardData: Codable {
    let ppEmail: String
    let ppEmailFontStyle: String

    enum CodingKeys: String, CodingKey {

        case ppEmail = "pp_Email"
        case ppEmailFontStyle = "pp_email_font_style"
    }

}
}
...