100 % local: tus datos nunca salen de tu navegador

JSON a Swift — Codable con CodingKeys ya escritas

Convierte una muestra JSON en structs Swift conformes a Codable. Las claves imposibles como propiedad vuelven por CodingKeys, ya escritas para ti.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Swift

Qué hace esta herramienta

Una muestra JSON pasa a ser structs de Swift conformes a Codable.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
struct Root: Codable {
    let id: Int
    let firstName: String
    let address: Address
}

struct Address: Codable {
    let city: String
}

JSONDecoder lee eso directamente. Cada objeto anidado recibe su struct; un array de objetos en la raíz recibe un typealias, para que la lista también tenga nombre.

CodingKeys allí donde el nombre tuvo que cambiar

Un nombre de propiedad no puede llevar guion, no puede empezar por dígito, y una palabra clave pide acentos graves. Cuando una clave no puede ser un nombre tal cual, la correspondencia se escribe:

struct Root: Codable {
    let contentType: String
    let `class`: Int
    let f2fa: Bool

    enum CodingKeys: String, CodingKey {
        case contentType = "content-type"
        case `class`
        case f2fa = "2fa"
    }
}

Fíjate en que `class` conserva su clave sin correspondencia: los acentos graves cambian cómo lee Swift el nombre, no el nombre. La enumeración lista todos los casos en cuanto existe, porque un CodingKeys parcial dejaría caer en silencio las propiedades que omite.

JSONValue, y por qué está ahí

Un null, un array vacío o uno mezclado no dejan nada que inferir. Swift no tiene un «valor JSON cualquiera» ya hecho que se decodifique y se codifique, así que se emite una enumeración pequeña una vez, al final:

let nickname: JSONValue?
let tags: [JSONValue]

Cubre las seis cosas que JSON puede contener, y nada más. Si más tarde sabes que el campo es una cadena anulable, String? la sustituye y la enumeración puede irse.

Lo que una muestra no puede decir

Solo un null produce un opcional. Todo lo demás es no opcional, porque el documento traía un valor, y un ? añadido después es un carácter, mientras que uno de más esconde un campo ausente hasta que importa.

Int y Double vienen de cómo se escribió el número, no de su valor: 3 da Int, 3.0 da Double. La distinción importa en Swift, donde decodificar 3.5 en un Int lanza en vez de redondear.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Cuándo obtengo una enumeración `CodingKeys`?
En cuanto un nombre de propiedad difiere de su clave. `content-type` no puede ser un nombre: pasa a `contentType`, y la enumeración lo vuelve a atar —`case contentType = "content-type"`—. Cuando todos los nombres ya coinciden con su clave, la enumeración sería ruido y no se emite: Swift la sintetiza.
¿Qué es esta enumeración `JSONValue` del final?
Un tipo Codable pequeño para los valores que la muestra no pudo fijar: `null`, un array vacío, un array heterogéneo. Swift no tiene un «any Codable» que haga la ida y vuelta, así que la enumeración recoge lo que JSON puede contener. Se emite una vez, solo si algo la necesita, y puedes borrarla al sustituir esos campos por tipos reales.
¿Las propiedades deberían ser `let` o `var`?
`let` por defecto, porque una carga decodificada es un valor. El ajuste pasa todo el struct a `var` cuando construyes el objeto en vez de leerlo. Mezclar ambos es una decisión campo a campo, que conviene tomar a mano cuando el modelo se asiente.

Convertidores relacionados