100 % local: tus datos nunca salen de tu navegador

JSON a Kotlin — data classes listas para pegar

Convierte una muestra JSON en data classes de Kotlin. Los nombres siguen siendo los del JSON, entre acentos graves donde hace falta, listos para compilar.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Kotlin

Qué hace esta herramienta

Una muestra JSON pasa a ser data class de Kotlin, una por objeto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
data class Root(
    val id: Long,
    val firstName: String,
    val address: Address,
)

data class Address(
    val city: String,
)

Cada propiedad es un val: una carga decodificada es un valor. Las data class te dan equals, hashCode, toString y copy(); esta última es la forma de cambiar un campo sin mutar nada.

La clave sigue siendo la clave

Los identificadores de Kotlin se escriben entre acentos graves, y con eso basta para conservar una clave JSON tal cual:

data class Root(
    val `content-type`: String,
    val `class`: Long,
    val `2fa`: Boolean,
)

class es palabra clave, content-type lleva guion, 2fa empieza por dígito: nada de eso importa entre acentos graves. Con kotlinx.serialization, el nombre de la propiedad es el nombre JSON: se decodifica así, sin anotación alguna.

Con Jackson o Moshi, el nombre de la propiedad también es lo que buscan, así que los nombres entre acentos graves funcionan igual. Solo si decides renombrar una propiedad —contentType en vez de `content-type`— necesitas @JsonProperty("content-type") o @Json(name = "content-type") para volver a apuntar a la clave.

Los tipos y el ? que no está

  • Los enteros pasan a Long y los decimales a Double, lo que un número JSON puede llevar sin discusión.
  • null y los valores desconocidos pasan a Any?: el único sitio donde aparece un signo de interrogación, porque es el único donde la muestra mostraba uno.
  • Un array vacío o mezclado pasa a List<Any>.

Nada más admite nulos y nada tiene valor por defecto. Un campo a veces ausente es un ? y un = null que añades tú, cuando una segunda carga te haya dicho lo que esta no podía.

Dos claves, dos propiedades

Dos claves que chocarían como nombres de propiedad se mantienen separadas en vez de fundirse: la segunda lleva un sufijo numerado. Como el nombre entre acentos graves es el nombre JSON, aquí las colisiones son raras: solo ocurren cuando la reparación es inevitable.

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

¿Por qué mi propiedad se llama `` `content-type` `` con acentos graves?
Porque Kotlin admite cualquier identificador entre acentos graves, y así se conserva la clave JSON como nombre de propiedad. Con kotlinx.serialization el nombre de la propiedad *es* el nombre JSON: no hace falta nada más. Con Jackson o Moshi el mismo resultado pide una anotación —`@JsonProperty` o `@Json(name = …)`— añadida a mano.
¿Los campos deberían ser `val` o `var`?
`val`, porque una carga decodificada es un valor, no un formulario. Hacerlo todo mutable invita a código que modifica el objeto en el sitio y luego se pregunta qué versión está mirando. Donde de verdad haga falta modificar, `copy()` devuelve una instancia nueva con un campo cambiado: el idioma para el que existen las data class.
¿Por qué ningún valor por defecto?
Porque un defecto es una afirmación sobre lo que significa una clave ausente, y una muestra nunca enseña una clave ausente. Un `= null` convertiría «ausente» en «null» para todo el código. Añadirlo es una palabra cuando conoces la API; adivinarlo es una decisión que nadie le pidió a esta herramienta.

Convertidores relacionados