Inicio › Herramientas para desarrolladores › JSON a data class de Kotlin

JSON a data class de Kotlin

Pega un objeto JSON o una respuesta de API y obtén data classes de Kotlin listas para usar, con propiedades en camelCase, tipos anulables y anotaciones @SerialName, @SerializedName, @Json o @JsonProperty. Todo se ejecuta en tu navegador.

Última actualización:

Tu JSON se analiza localmente en esta pestaña y nunca se sube. Consejo: Ctrl + Intro genera el código.

Publicidad
Publicidad

Cómo usar JSON a data class de Kotlin

  1. Pega tu JSON en el cuadro de la izquierda o abre un archivo .json. Se carga un ejemplo para que veas el resultado enseguida.
  2. Ponle nombre a la clase raíz y define el paquete (déjalo en blanco para omitir la línea package).
  3. Elige tu biblioteca de serialización: kotlinx.serialization, Gson, Moshi, Jackson o ninguna.
  4. Elige la anulabilidad y el estilo: propiedades anulables, valores predeterminados = null, Int o Long, val o var, clases anidadas.
  5. Pulsa Generar clases Kotlin y luego copia el código o descarga el archivo .kt en tu proyecto.

Ejemplo: de JSON a data classes de Kotlin

Esta respuesta de API tiene una clave en snake_case, un objeto anidado, un array de objetos y un valor que puede ser null:

{ "user_id": 42, "display_name": "Ada", "avatar": null,
  "posts": [ { "id": 1, "title": "Hello", "score": 4.5 },
             { "id": 2, "title": "Draft", "score": 3, "cover": "a.png" } ] }

Con kotlinx.serialization y las opciones predeterminadas, el generador produce:

@Serializable
data class Root(
    @SerialName("user_id") val userId: Int,
    @SerialName("display_name") val displayName: String,
    val avatar: JsonElement? = null,
    val posts: List<Post>
)

@Serializable
data class Post(
    val id: Int,
    val title: String,
    val score: Double,
    val cover: String? = null
)

score es Double porque un elemento tiene 4.5, y cover es anulable con valor predeterminado porque solo un elemento lo tiene. avatar siempre es null, así que no se puede saber su tipo real: pasa a ser JsonElement? (o Any? con otras bibliotecas). Sustitúyelo por String? cuando lo sepas.

Cómo se corresponden los valores JSON con los tipos de Kotlin

Valor JSONTipo Kotlin
"text"String
42Int, o Long fuera de ±2,147,483,647
3.14, 1e6Double
true / falseBoolean
"x" o null, o una clave ausenteString? = null
{ … }Una data class (de nivel superior o anidada)
{}JsonObject / Map<String, Any?>
[1, 2] / []List<Int> / List<JsonElement>
[1, "two"] o siempre nullJsonElement / Any?

Anotaciones de nombre por biblioteca

BibliotecaAnotación de claseAnotación de propiedadDecodificar
kotlinx.serialization@Serializable@SerialName("key")Json.decodeFromString<Root>(text)
Gsonninguna@SerializedName("key")Gson().fromJson(text, Root::class.java)
Moshi (codegen)@JsonClass(generateAdapter = true)@Json(name = "key")moshi.adapter(Root::class.java).fromJson(text)
Jacksonninguna (registra KotlinModule)@JsonProperty("key")jacksonObjectMapper().readValue<Root>(text)
  • Claves desconocidas: kotlinx.serialization lanza una excepción con las claves que no tienen propiedad, salvo que crees el parser con Json { ignoreUnknownKeys = true }. Gson y Moshi las ignoran; Jackson falla salvo que se desactive FAIL_ON_UNKNOWN_PROPERTIES.
  • kotlinx.serialization necesita su plugin de compilador (plugin.serialization en Gradle); Moshi codegen necesita KSP o kapt con moshi-kotlin-codegen.
  • ID grandes: usa Long para ID numéricos superiores a 2,147,483,647, como los ID snowflake de tipo Twitter.

Preguntas frecuentes

¿Cómo se crean los nombres de propiedad de Kotlin a partir de las claves JSON?

Cada clave se divide en palabras por guiones bajos, guiones, espacios y límites de camelCase y se une en camelCase, así que user_name pasa a ser userName y email-notifications pasa a ser emailNotifications. Cuando el nombre de la propiedad difiere de la clave, el generador añade la anotación de nombre de tu biblioteca (@SerialName, @SerializedName, @Json o @JsonProperty) para que la decodificación siga coincidiendo con el JSON.

¿Qué propiedades se vuelven anulables?

Por defecto, una propiedad es anulable (por ejemplo String?) cuando su valor es null en algún lugar del JSON o cuando la clave falta en algunos elementos de un array. También puedes hacer anulables todas las propiedades, que es la opción más segura para API que no controlas, o ninguna. Con la opción de valor predeterminado activada, las propiedades anulables reciben = null para que una clave ausente no haga fallar la decodificación.

¿Por qué las clases de kotlinx.serialization necesitan @Serializable?

kotlinx.serialization genera el serializador en tiempo de compilación con su plugin de Gradle, y solo lo hace para las clases marcadas con @Serializable. Los valores cuyo tipo no se puede saber, como un campo que siempre es null o que mezcla cadenas y números, se tipan como JsonElement para que aun así puedan decodificarse.

¿Gson respeta los valores predeterminados y los tipos no nulos de Kotlin?

No del todo. Salvo que todas las propiedades tengan un valor predeterminado, Gson crea los objetos sin llamar al constructor de Kotlin, así que una clave ausente puede dejar null en una propiedad no nula y los valores predeterminados se omiten. Si tu JSON puede omitir campos, elige 'Todas las propiedades' anulables con Gson, o usa kotlinx.serialization o Moshi codegen, que respetan la anulabilidad y los valores predeterminados de Kotlin.

¿Cómo se tipan los números?

Los números enteros pasan a ser Int, o Long cuando algún valor está fuera del rango de 32 bits (−2,147,483,648 a 2,147,483,647); también puedes forzar Long en todas partes. Los números con punto decimal o exponente pasan a ser Double. Si un campo mezcla números enteros y decimales, se usa Double.

¿Qué pasa con un array JSON en el nivel superior?

El tipo de los elementos se genera como data class y un comentario te recuerda que debes decodificar el JSON como List<Item>, por ejemplo Json.decodeFromString<List<Item>>(text). Un array de nivel superior con valores simples se convierte en un typealias como typealias Root = List<String>.

¿Se sube mi JSON?

No. El análisis y la generación de código son JavaScript simple que se ejecuta en esta página, así que las respuestas de API con datos personales o secretos nunca salen de tu dispositivo.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →