Декодируемый JSONDecoder обрабатывает разные ключи кодирования для одного и того же значения - PullRequest
0 голосов
/ 03 июля 2018

Я использую декодируемый протокол Swift для анализа моего ответа JSON:

{  
    "ScanCode":"4122001131",
    "Name":"PINK",
    "attributes":{  
            "type":"Product",          
            "url":""
     },
    "ScanId":"0000000kfbdMA"
}

Я сталкиваюсь с проблемой, когда иногда я получаю значение ScanId с ключом «Id» вместо «ScanId». Есть ли способ обойти это?

Спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны написать собственный инициализатор для обработки случаев, например

struct Thing : Decodable {
    let scanCode, name, scanId : String

    private enum CodingKeys: String, CodingKey { case scanCode = "ScanCode", name = "Name", ScanID, Id }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        scanCode = try container.decode(String.self, forKey: .scanCode)
        name = try container.decode(String.self, forKey: .name)
        if let id = try container.decodeIfPresent(String.self, forKey: .Id) {
            scanId = id
        } else {
            scanId = try container.decode(String.self, forKey: .ScanID)
        }
    }
}

Сначала попытайтесь декодировать один ключ, если не удается декодировать другой ключ.

Для удобства я пропустил клавишу attributes

...