Saltar al contenido

Convertir JSON a clases de datos de Kotlin — Numio

Genera data classes de Kotlin a partir de una muestra JSON. Los enteros pasan a Long, los decimales a Double, cada objeto anidado recibe su propia clase y las claves que faltan en algunos elementos de un array pasan a tipos anulables como Boolean?.

Modelar una respuesta REST para una app Android que parsea JSON con Jackson.

JSON

Cuándo usarla

  • Modelar una respuesta REST para una app Android que parsea JSON con Jackson.
  • Crear DTOs para un servicio Ktor o Spring Boot a partir de un payload de ejemplo.

Cómo usarla

  1. Pega un objeto o array JSON representativo en el editor JSON; incluye elementos de array que muestren las claves opcionales.
  2. Revisa el panel de Kotlin: la clase de nivel superior se llama Root y las clases anidadas toman el nombre de su clave (projects pasa a Project).
  3. Copia las clases, cambia el nombre de Root y sustituye Any? o Long donde el contrato de tu API indique otra cosa.

Entrada JSON

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Data classes de Kotlin

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

Detalles y limitaciones

La conversión se ejecuta en el navegador con el módulo WebAssembly json_typegen; el JSON no se sube. Esta página no tiene configuración.

Las claves que no están en camelCase reciben una anotación @JsonProperty de Jackson y el import com.fasterxml.jackson.annotation.JsonProperty. No se generan anotaciones de kotlinx.serialization ni de Moshi.

Los valores null y los arrays vacíos no aportan información de tipo, así que pasan a Any? y List<Any?>.

Los campos anulables no tienen valor por defecto (= null). Añádelo tú si el campo puede faltar al deserializar.

FAQ

¿Por qué un entero tiene tipo Long en vez de Int?

El generador usa siempre Long para los números enteros, para que los IDs grandes no se desborden. Los números que no caben en un entero de 64 bits, o que se escriben con punto decimal, pasan a Double.

¿Puedo convertir un array JSON en la raíz?

Sí. Un array en la raíz produce un typealias, por ejemplo typealias Root = List<Root2>;, más una data class Root2 para el tipo de los elementos. Cambia el nombre de ambos para adaptarlos a tu código.

¿Por qué un array mixto corto se convirtió en Pair<Long, String>?

json_typegen trata un array corto cuyos elementos tienen tipos distintos como una tupla, así que [1, "a"] pasa a Pair<Long, String>. Cámbialo a List<Any> si el array es realmente una lista.

Especificaciones y referencias