100 % local — seus dados nunca saem do seu navegador

JSON para Swift — Codable com CodingKeys prontas

Transforme uma amostra JSON em structs Swift conformes a Codable. As chaves impossíveis como propriedade voltam por CodingKeys, já escritas para você.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Swift

O que esta ferramenta faz

Uma amostra JSON vira structs Swift que cumprem 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
}

O JSONDecoder lê isso direto. Cada objeto aninhado ganha o seu struct; um array de objetos na raiz ganha um typealias, para que a lista também tenha nome.

CodingKeys onde o nome teve de mudar

Um nome de propriedade não leva hífen, não começa por dígito, e uma palavra-chave pede crases. Quando uma chave não pode ser nome como está, o mapeamento é escrito:

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

Repare que `class` guarda a sua chave sem mapeamento: as crases mudam como o Swift lê o nome, não o nome. A enumeração lista todos os casos assim que existe, porque um CodingKeys parcial derrubaria em silêncio as propriedades que omite.

JSONValue, e por que ela está ali

Um null, um array vazio ou um array misto não deixam nada a inferir. O Swift não tem um «valor JSON qualquer» pronto que decodifique e codifique, então sai uma enumeração pequena, uma vez, no fim:

let nickname: JSONValue?
let tags: [JSONValue]

Ela cobre as seis coisas que o JSON pode conter, e nada mais. Se depois você souber que o campo é uma string anulável, String? a substitui e a enumeração pode ir embora.

O que uma amostra não consegue dizer

Só um null produz um opcional. Todo o resto é não opcional, porque o documento trazia um valor — e um ? acrescentado depois tem um caractere, ao passo que um a mais esconde um campo ausente até a hora em que ele importa.

Int e Double vêm de como o número foi escrito, não do seu valor: 3 dá Int, 3.0 dá Double. A distinção importa no Swift, onde decodificar 3.5 num Int lança em vez de arredondar.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

Quando eu ganho uma enumeração `CodingKeys`?
Assim que um nome de propriedade difere da sua chave. `content-type` não pode ser nome: vira `contentType`, e a enumeração o amarra de volta — `case contentType = "content-type"`. Quando todos os nomes já batem com as chaves, a enumeração seria ruído e não é emitida: o Swift a sintetiza.
O que é essa enumeração `JSONValue` no fim?
Um tipo Codable pequeno para os valores que a amostra não conseguiu fixar: `null`, um array vazio, um array heterogêneo. O Swift não tem um «any Codable» que faça a ida e volta, então a enumeração lista o que o JSON pode conter. Ela sai uma vez, só quando algo precisa, e você pode apagá-la ao trocar esses campos por tipos reais.
As propriedades deveriam ser `let` ou `var`?
`let` por padrão, porque uma carga decodificada é um valor. O ajuste passa o struct inteiro para `var` quando você constrói o objeto em vez de lê-lo. Misturar os dois é decisão campo a campo, boa de tomar à mão quando o modelo assentar.

Conversores relacionados