es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo decodificar datos JSON anidados cuando no se sabe qué tipo de elemento sería en Swift?

Estoy intentando decodificar datos JSON de una llamada de API y tengo algunas clases decodificables para decodificar JSON, pero tengo un problema.
En el JSON, hay un solo elemento con el mismo nombre (digamos “valor”) pero tiene ya sea una cadena o un entero dependiendo del “tipo” de cada uno.

¿Alguien puede ayudarme a estructurar mi clase decodificable en este caso? (mi ejemplo de clase decodificable está abajo)

Ejemplo de JSON:

0:{
“tipo”: “tipo1”,
“valor”: “73%”
}
1:{
“tipo”: “tipo2”,
“valor”: 2
}
2:{
“tipo”: “tipo3”,
“valor”: NULL
}

Clase de ejemplo para decodificar:

class EjemploClaseParaDecodificar: Decodable {
let tipo: String
let valor: String? // este elemento puede ser una cadena o un entero en los datos JSON de retorno
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para manejar el caso en el que el elemento “value” en el JSON puede ser una cadena o un entero, puede crear una función de decodificación personalizada en su clase que verifique el tipo del valor antes de decodificarlo.

    Aquí hay una versión actualizada de su ExampleClassToDecode con una función de decodificación personalizada:

    “ `swift
    clase ExampleClassToDecode: Decodable {
    let tipo: String
    let valor: ¿Cualquier cosa?

    // Función de decodificación personalizada
    requerido init (desde el decodificador: Decodificador) lanza {
        let contenedor = tratar decodificador .envase (clave marcada por: CodingKeys.self)
        tipo = tratar contenedor .decodificar (String.self, para la clave: .tipo)
        si permite stringValue = tratar contenedor .decodificar (String.self, para la clave: .valor) {
            // Si el valor es una cadena, guárdelo como una cadena
            valor = stringValue 
        } else si permite intValue = tratar contenedor .decodificar (Int.self, para la clave: .valor) {
            // Si el valor es un entero, guárdelo como un entero
            valor = intValue
        } más {
            // Si el valor es nulo o algún otro tipo, guárdelo como nulo
            valor = nulo
        }
    }
    
    privado enum CodingKeys: String, CodingKey {
        caso tipo, valor
    }
    

    }
    “ `

    La función de decodificación personalizada verifica si el elemento “valor” es una cadena o un entero usando una declaración condicional. Si es una cadena, se decodifica como una cadena y se almacena como una cadena en la clase. Si es un entero, se decodifica como un entero y se almacena como un entero en la clase. Si es nulo o algún otro tipo, se almacena como nulo en la clase.

Comments are closed.