100 % local — vos données ne quittent jamais votre navigateur

JSON en Swift — Codable, CodingKeys déjà écrites

Transformez un échantillon JSON en structs Swift conformes à Codable. Les clés impossibles en propriétés reviennent par CodingKeys, déjà écrites pour vous.

Instantané Privé Zéro cookie

Entrée JSON

Sortie Swift

Ce que fait cet outil

Un échantillon JSON devient des structs Swift conformes à 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 lit cela directement. Chaque objet imbriqué obtient sa struct ; un tableau d’objets à la racine obtient un typealias, pour que la liste ait un nom elle aussi.

Des CodingKeys là où le nom a dû changer

Un nom de propriété ne peut pas contenir de tiret, ne peut pas commencer par un chiffre, et un mot-clé demande des accents graves. Quand une clé ne peut pas être un nom telle quelle, la correspondance est écrite :

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"
    }
}

Remarquez que `class` garde sa clé sans correspondance : les accents graves changent la façon dont Swift lit le nom, pas le nom lui-même. L’énumération liste tous les cas dès qu’elle existe, car un CodingKeys partiel laisserait tomber en silence les propriétés qu’il omet.

JSONValue, et pourquoi elle est là

Un null, un tableau vide ou un tableau mêlé ne laissent rien à inférer. Swift n’a pas de « valeur JSON quelconque » toute faite qui se décode et s’encode, une petite énumération est donc émise une fois, à la fin :

let nickname: JSONValue?
let tags: [JSONValue]

Elle traite les six choses que JSON peut contenir, et rien d’autre. Si vous apprenez plus tard que le champ est une chaîne nullable, String? la remplace et l’énumération peut partir.

Ce qu’un échantillon ne peut pas dire

Seul un null produit un optionnel. Tout le reste est non optionnel, parce que le document avait une valeur — et un ? ajouté plus tard fait un caractère, tandis qu’un ? de trop masque un champ manquant jusqu’au moment où il compte.

Int et Double viennent de l’écriture du nombre, pas de sa valeur : 3 donne Int, 3.0 donne Double. La distinction compte en Swift, où décoder 3.5 dans un Int lève une erreur au lieu d’arrondir.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Quand obtient-on une énumération `CodingKeys` ?
Dès qu’un nom de propriété diffère de sa clé. `content-type` ne peut pas être un nom : il devient `contentType`, et l’énumération le rattache — `case contentType = "content-type"`. Quand tous les noms correspondent déjà à leur clé, l’énumération serait du bruit et n’est pas émise : Swift la synthétise.
Qu’est-ce que cette énumération `JSONValue` en bas ?
Un petit type Codable pour les valeurs que l’échantillon n’a pas su fixer : `null`, un tableau vide, un tableau hétérogène. Swift n’a pas d’« any Codable » qui fasse l’aller-retour, l’énumération recense donc ce que JSON peut contenir. Elle est émise une fois, seulement si quelque chose en a besoin, et vous pouvez la supprimer en remplaçant ces champs par de vrais types.
Les propriétés devraient-elles être `let` ou `var` ?
`let` par défaut, parce qu’une charge décodée est une valeur. Le réglage bascule toute la struct en `var` quand vous construisez l’objet plutôt que vous ne le lisez. Mélanger les deux est une décision champ par champ, à prendre à la main une fois le modèle stabilisé.

Convertisseurs associés