Volver al código Swift

Convertir el JSON de una API en objetos con fechas reales

Codable con claves renombradas y fechas ISO 8601: el JSON entra como texto y sale como estructuras tipadas.

El problema

La API devuelve creado_en como texto y en snake_case. La app necesita un Date de verdad y nombres al estilo Swift, sin convertir campo por campo a mano.

Swift
import Foundation

struct Pedido: Codable {
    let id: Int
    let cliente: String
    let total: Double
    let creadoEn: Date

    enum CodingKeys: String, CodingKey {
        case id, cliente, total
        case creadoEn = "creado_en"
    }
}

let json = """
[{"id": 1, "cliente": "Ana", "total": 149.9, "creado_en": "2026-03-01T10:30:00Z"}]
""".data(using: .utf8)!

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601

do {
    let pedidos = try decoder.decode([Pedido].self, from: json)
    for p in pedidos { print("#\(p.id) \(p.cliente): \(p.total) el \(p.creadoEn)") }
} catch {
    print("JSON inválido:", error)
}

Por qué está escrito así

  1. Al declarar Codable, el compilador escribe solo la conversión entre JSON y la estructura.
  2. CodingKeys traduce nombres: creado_en en el JSON, creadoEn en el código.
  3. dateDecodingStrategy = .iso8601 convierte el texto de la fecha en un Date sin código extra.
  4. Si falta un campo o el tipo no coincide, decode lanza un error que dice exactamente cuál.
Cómo probarlo

Guardalo como pedidos.swift y corré: swift pedidos.swift. Borrá un campo del JSON para ver el error que da.

Ojo con esto

.iso8601 no acepta fracciones de segundo ("10:30:00.123Z"). Si tu API las manda, hace falta un ISO8601DateFormatter con esa opción o un formato propio.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo este modelo Codable en Swift. Mi API devuelve este JSON: [EJEMPLO DE JSON REAL]. Generá las estructuras completas, con los campos opcionales marcados como tales, las fechas en el formato que usa mi API ([FORMATO DE FECHA]) y un ejemplo de llamada con URLSession y async/await que maneje error de red, código HTTP distinto de 200 y JSON inválido por separado.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.