Dans une application Android, je dois désérialiser les données Json pour les classes de données Kotlin, avec un seul niveau d'abstraction. Mais je n'ai aucune idée, de placer les propriétés correctes dans les constructeurs.Comment désérialiser les classes de données héritées de Kotlin avec Gson
En version simple, disons que j'ai une forme:
abstract class Shape(open val x: Int, open val y: Int)
avec deux dérivations
data class Circle(val radius: Int, override val x: Int, override val y: Int): Shape(x, y)
et
data class Square(val width: Int, override val x: Int, override val y: Int): Shape(x, y)
Donc, mon objectif est de ne pas instancier un Forme. Donc, au lieu de cela, désérialisez toujours ses dérivations. Plus tard, je dois gérer des propriétés de collecte dans d'autres classes comme:
val shapes: List<Shape>
, mais je dois aussi connaître le type dérivé de chaque élément.
Lorsque je tente de désérialiser l'exemple avec Gson
val square = gson.fromJson(SQUARE_JSON, Square::class.java)
Je reçois toujours un IllegalArgumentException
java.lang.IllegalArgumentException: class com.example.shapes.model.Square declares multiple JSON fields named x
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.Gson.fromJson(Gson.java:886)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
Est-il possible de désérialiser cette classe correctement sans écrire une coutume Gson TypeAdapter ou perdre avantages de classe de données?
Merci
Merci. C'est la solution que je cherchais. – elcolto