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.
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í
- Al declarar Codable, el compilador escribe solo la conversión entre JSON y la estructura.
- CodingKeys traduce nombres: creado_en en el JSON, creadoEn en el código.
- dateDecodingStrategy = .iso8601 convierte el texto de la fecha en un Date sin código extra.
- Si falta un campo o el tipo no coincide, decode lanza un error que dice exactamente cuál.
Guardalo como pedidos.swift y corré: swift pedidos.swift. Borrá un campo del JSON para ver el error que da.
.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.
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.
Comentarios
Todavía no hay comentarios. El primero puede ser el tuyo.
¿Lo adaptaste a algo tuyo?
Contame qué resolviste con esto, o qué le faltó.