Voltar ao 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.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

O 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 que está escrito assim

  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.
Como testar

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

Atenção

.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.

Adapte ao seu caso com IA

O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou Copilot.

O 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.

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.