Usar codificable con clave que a veces es una Int y otras veces una Cadena

Tengo una API que a veces devuelve una clave específica (en este casoid) en el JSON como Int y otras veces devolverá la misma clave como String. ¿Cómo uso codificable para analizar ese 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
    }
}

Sigo recibiendo este mensaje de error:Expected to decode String but found a number instead. La razón por la que devuelve un número es porque el campo de identificación está vacío y cuando el campo de identificación está vacío, el valor predeterminado es devolver 0 como una ID que identifica de forma codificable como un número. Básicamente, puedo ignorar la clave de identificación, pero codificar no me da la opción de ignorarla, que yo sepa. ¿Cuál sería la mejor manera de manejar esto?

Aquí está el JSON. Es super simple

Trabajando

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

Error: debido a que no hay una identificación en el sistema, devuelve 0 como valor predeterminado, que el codificador obviamente ve como un número opuesto a la cadena.

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta