100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in Swift — Codable con CodingKeys già scritte

Trasforma un campione JSON in struct Swift conformi a Codable. Le chiavi impossibili come proprietà tornano tramite CodingKeys, già scritte per te.

Istantaneo Privato Zero cookie

Input JSON

Output Swift

Che cosa fa questo strumento

Un campione JSON diventa struct Swift conformi 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 legge questo direttamente. Ogni oggetto annidato ottiene la sua struct; un array di oggetti alla radice ottiene un typealias, così anche la lista ha un nome.

CodingKeys dove il nome è dovuto cambiare

Un nome di proprietà non contiene trattini, non comincia con una cifra, e una parola chiave richiede i backtick. Quando una chiave non può essere un nome così com’è, la corrispondenza viene scritta:

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

Nota che `class` conserva la sua chiave senza corrispondenza: i backtick cambiano come Swift legge il nome, non il nome. L’enumerazione elenca tutti i casi appena esiste, perché una CodingKeys parziale lascerebbe cadere in silenzio le proprietà che omette.

JSONValue, e perché c’è

Un null, un array vuoto o uno misto non lasciano nulla da dedurre. Swift non ha un «valore JSON qualsiasi» pronto che si decodifichi e si codifichi, quindi una piccola enumerazione viene emessa una volta, alla fine:

let nickname: JSONValue?
let tags: [JSONValue]

Copre le sei cose che JSON può contenere, e nient’altro. Se più tardi sai che il campo è una stringa annullabile, String? la sostituisce e l’enumerazione può andarsene.

Ciò che un campione non può dire

Solo un null produce un opzionale. Tutto il resto non lo è, perché il documento aveva un valore — e un ? aggiunto dopo è un carattere, mentre uno di troppo nasconde un campo mancante finché non conta.

Int e Double vengono da come il numero è stato scritto, non dal suo valore: 3 dà Int, 3.0 dà Double. La distinzione conta in Swift, dove decodificare 3.5 in un Int solleva invece di arrotondare.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Quando ottengo un’enumerazione `CodingKeys`?
Appena un nome di proprietà differisce dalla sua chiave. `content-type` non può essere un nome: diventa `contentType`, e l’enumerazione lo rilega — `case contentType = "content-type"`. Dove tutti i nomi corrispondono già alle chiavi, l’enumerazione sarebbe rumore e non viene emessa: Swift la sintetizza.
Che cos’è questa enumerazione `JSONValue` in fondo?
Un piccolo tipo Codable per i valori che il campione non ha potuto fissare: `null`, un array vuoto, un array eterogeneo. Swift non ha un «any Codable» che faccia andata e ritorno, quindi l’enumerazione elenca ciò che JSON può contenere. Esce una volta, solo se qualcosa la richiede, e puoi cancellarla sostituendo quei campi con tipi veri.
Le proprietà dovrebbero essere `let` o `var`?
`let` per default, perché un carico decodificato è un valore. L’impostazione porta l’intera struct a `var` quando costruisci l’oggetto invece di leggerlo. Mescolare i due è una decisione campo per campo, da prendere a mano quando il modello si assesta.

Convertitori correlati