Generador de data class Kotlin desde JSON
Pega una respuesta de API en JSON y obtén sus data class de Kotlin. Las clases sin anotaciones sirven para Gson, Moshi o Jackson; la opción kotlinx.serialization añade @Serializable a cada clase y @SerialName donde la clave no es un nombre camelCase.
Funciona en tu navegador: nada de lo que escribes se envía a ningún sitio.
Cómo se usa
- Pega un ejemplo de JSON, mejor con varios elementos en cada array para encontrar las claves opcionales.
- Elige data class sin anotaciones o con anotaciones de kotlinx.serialization.
- Copia el código a un archivo .kt y renombra Root y las demás clases según tu proyecto.
Cómo funciona
El ejemplo se convierte en una «forma»: cada clave con todos los tipos que aparecen en ella, y todos los objetos de un array fusionados en una clase.
- Los nombres de clase salen de las claves: items contiene List
- , line_items una List. Root va primero.
- Las propiedades son val, una por línea, con coma final (Kotlin 1.4+).
- Con kotlinx.serialization se importan Serializable, SerialName y JsonElement solo cuando hacen falta.
- Un array de nivel superior da un typealias, por ejemplo typealias Root = List.
Ejemplo
{"line_items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} con kotlinx.serialization da:
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Root(
@SerialName("line_items")
val lineItems: List<LineItem>,
)
@Serializable
data class LineItem(
val sku: String,
val note: String?,
val qty: Long? = null,
)
Consejos
- Decodifica con
Json.decodeFromString<Root>(text); añade Json { ignoreUnknownKeys = true } si los datos reales tienen más claves que el ejemplo.
- Cambia Long por Int donde sepas que los valores son pequeños.
- En proyectos Android con Gson, elige Sin anotaciones y cambia los comentarios por @SerializedName.
Preguntas frecuentes
¿Cómo se traducen los tipos de JSON a Kotlin?
Las cadenas pasan a String, true y false a Boolean, los enteros a Long y los demás números a Double (una mezcla da Double). Los arrays pasan a List<T> y los objetos a data class propias. Un lugar con valores de distinto tipo pasa a Any? sin anotaciones y a JsonElement? con kotlinx.serialization.
¿Qué diferencia hay entre String? y String? = null?
Un valor que es null en el ejemplo recibe String?: la clave debe estar, aunque valga null. Una clave que falta en algunos objetos de un array recibe String? = null, así la decodificación funciona sin ella; kotlinx.serialization necesita ese valor por defecto.
¿Qué pasa con claves como order_id o in?
Las propiedades van en camelCase: order_id pasa a orderId. Con kotlinx.serialization la clave original va en @SerialName("order_id"); sin anotaciones, un comentario la conserva y puedes añadir la anotación de tu librería (@SerializedName en Gson, @Json en Moshi). Una palabra reservada de Kotlin, como in, se escribe entre comillas invertidas.
¿Por qué un objeto vacío pasa a ser una clase normal?
Una data class necesita al menos una propiedad en su constructor, así que un objeto sin claves pasa a class Meta (o @Serializable class Meta).