Inicio › Herramientas para desarrolladores › JSON a struct de Swift

JSON a struct de Swift

Pega un objeto JSON o una respuesta de API y obtén structs Codable de Swift listos para usar, con propiedades en camelCase, CodingKeys, opcionales y tipos anidados. Todo se ejecuta en tu navegador.

Última actualización:

Tu JSON se analiza localmente en esta pestaña y nunca se sube. Consejo: Ctrl + Intro genera el código.

Publicidad
Publicidad

Cómo usar JSON a struct de Swift

  1. Pega tu JSON en el cuadro de la izquierda o abre un archivo .json. Hay un ejemplo cargado para que veas el resultado al instante.
  2. Ponle nombre al struct raíz, por ejemplo User o APIResponse.
  3. Elige cómo se crean los nombres de las propiedades: camelCase con CodingKeys, nombres para .convertFromSnakeCase o las claves JSON tal cual.
  4. Define opcionales, protocolos y estilo: Codable o Decodable, let o var, acceso public, tipos anidados, análisis de fechas Date.
  5. Pulsa Generar structs de Swift y copia el código o descarga el archivo .swift y decodifica con JSONDecoder.

Ejemplo: de JSON a structs Codable de Swift

Esta respuesta de API tiene claves en snake_case, una fecha, un array anidado de objetos y un campo que falta en un elemento:

{ "user_id": 42, "display_name": "Ada", "joined_at": "2024-05-01T09:30:00Z",
  "posts": [ { "id": 1, "title": "Hello", "score": 4.5 },
             { "id": 2, "title": "Draft", "score": 3, "cover_url": "a.png" } ] }

Con las opciones por defecto, el generador produce:

struct Root: Codable {
    let userID: Int
    let displayName: String
    let joinedAt: Date
    let posts: [Post]

    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case displayName = "display_name"
        case joinedAt = "joined_at"
        case posts
    }
}

struct Post: Codable {
    let id: Int
    let title: String
    let score: Double
    let coverURL: String?

    enum CodingKeys: String, CodingKey {
        case id, title, score
        case coverURL = "cover_url"
    }
}

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let root = try decoder.decode(Root.self, from: jsonData)

coverURL es opcional porque solo una publicación lo tiene, y score es Double porque un valor es 4.5.

Cómo se asignan los valores JSON a tipos de Swift

Valor JSONTipo de Swift
"text"String
"2024-05-01T09:30:00Z"Date (con .iso8601, cuando la opción está activada)
42Int
3.14, 1e6Double
true / falseBool
"x" o null, o una clave ausenteString?
{ … }Un struct anidado
{}[String: JSONValue]
[1, 2] / [][Int] / [JSONValue]
[1, "two"] o siempre nullJSONValue

¿CodingKeys o convertFromSnakeCase?

Ambos enfoques decodifican el mismo JSON en snake_case. Las CodingKeys explícitas mantienen la asignación visible en el tipo, te permiten usar siglas de Swift como userID y coverURL, y funcionan sea cual sea la configuración del decodificador. .convertFromSnakeCase deja los structs más cortos, pero los nombres de las propiedades deben coincidir exactamente con su conversión (user_id pasa a ser userId), y cada decodificador que lea el tipo debe definir la estrategia. Elige la opción correspondiente arriba y el generador nombrará las propiedades por ti.

  • JSONDecoder ignora las claves desconocidas, así que puedes borrar las propiedades que no necesites.
  • Una clave no opcional ausente lanza DecodingError.keyNotFound; haz la propiedad opcional si la API a veces la omite.
  • Identifiable: los structs con una propiedad id pueden adoptar Identifiable para las listas de SwiftUI añadiéndolo a la lista de protocolos.

Preguntas frecuentes

¿Cuándo añade el generador un enum CodingKeys?

El Codable sintetizado de Swift asocia los nombres de las propiedades exactamente con las claves JSON. Cuando el nombre de una propiedad difiere de su clave (por ejemplo, userName para user_name), el struct necesita un enum CodingKeys que asocie cada propiedad con su clave. El generador añade CodingKeys solo a los structs que lo necesitan y enumera todas las propiedades de ese struct, porque un enum CodingKeys debe cubrir todas las propiedades almacenadas que se decodifican.

¿Qué hace la opción convertFromSnakeCase?

JSONDecoder puede convertir por ti las claves en snake_case con decoder.keyDecodingStrategy = .convertFromSnakeCase. Elimina los guiones bajos, pone en minúsculas la primera palabra y en mayúscula inicial las siguientes, así que avatar_url pasa a ser avatarUrl (no avatarURL). Este modo nombra las propiedades exactamente como las produce esa estrategia, así que no hacen falta CodingKeys salvo para claves con caracteres como guiones.

¿Qué propiedades pasan a ser opcionales?

Por defecto, una propiedad es opcional (String?) cuando su valor es null en algún lugar del JSON o cuando la clave falta en algunos elementos de un array. El Codable sintetizado decodifica los opcionales con decodeIfPresent, así que una clave ausente o null se convierte en nil en lugar de lanzar un error. También puedes hacer opcionales todas las propiedades, lo más seguro para API que no controlas.

¿Cómo se tratan las fechas?

Las cadenas en formato de fecha y hora de internet ISO 8601, como 2024-05-01T09:30:00Z, pasan a ser Date cuando la opción está activada. Define decoder.dateDecodingStrategy = .iso8601 para que JSONDecoder pueda leerlas. Esa estrategia no acepta fracciones de segundo, así que marcas de tiempo como 2024-05-01T09:30:00.123Z se quedan como String; desactiva la opción para mantener todas las fechas como cadenas.

¿Qué es el enum JSONValue?

Swift no tiene un equivalente Codable de Any, así que un campo cuyo tipo no se puede saber (siempre null, mezcla de cadenas y números, o un objeto vacío) usa un pequeño enum JSONValue que se genera al final del código. Decodifica cualquier valor JSON en casos como .string, .number, .bool, .array, .object y .null y lo vuelve a codificar.

¿Cómo se tipan los números?

Los números enteros pasan a ser Int, que es de 64 bits en todas las plataformas actuales de Apple, y los números con punto decimal o exponente pasan a ser Double. Si un campo mezcla enteros y decimales, se usa Double.

¿Se sube mi JSON?

No. El análisis y la generación de código son JavaScript puro que se ejecuta en esta página, así que las respuestas de API con datos personales o secretos nunca salen de tu dispositivo.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →