Usando codificável com chave que às vezes é um Int e outras vezes um String

Eu tenho uma API que às vezes retornará uma chave específica (neste casoid) no JSON como Int e outras vezes retornará a mesma chave que uma String. Como uso codificável para analisar esse JSON?

struct GeneralProduct: Codable {
    var price:Double!
    var id:String?
    var name:String!

    private enum CodingKeys: String, CodingKey {
        case price = "p"
        case id = "i"
        case name = "n"
    }

    init(price:Double? = nil, id: String? = nil, name: String? = nil) {
        self.price = price
        self.id = id
        self.name = name
    }
}

Eu continuo recebendo esta mensagem de erro:Expected to decode String but found a number instead. O motivo pelo qual ele retorna um número é porque o campo de identificação está vazio e, quando o campo de identificação está vazio, o padrão é retornar 0 como um ID que codificável se identifica como um número. Basicamente, posso ignorar a chave de identificação, mas codificável não me dá a opção de ignorá-la ao meu conhecimento. Qual seria a melhor maneira de lidar com isso?

Aqui está o JSON. É super simples

Trabalhando

{
  "p":2.12,
  "i":"3k3mkfnk3",
  "n":"Blue Shirt"
}

Erro - porque não há um ID no sistema, ele retorna 0 como padrão, que codificável obviamente vê como um número oposto à string.

{
  "p":2.19,
  "i":0,
  "n":"Black Shirt"
}

questionAnswers(2)

yourAnswerToTheQuestion