Tengo un json que contiene una lista de objetos polimórficos,
{ "someList": [ { "type": "A", "value": {"aProp": false } }, { "type": "B", "value": {"bProp": "1" } }, ] }que representa una jerarquía de tipos como esta:
sealed class Base class A(val aProp: Boolean): Base() class B(val aProp: String): Base() class BaseList(val someList: List<Base>)Me gustaría deserializar el JSON en tales tipos,
pero el serializador de sellos/kotlinx polimórfico predeterminado lee y escribe el discriminador en el objeto mismo, así:
{ "someList": [ { "type": "A", "aProp": false }, { "type": "B", "bProp": "1" } ] }mientras que obtuve el discriminador fuera del objeto mismo.
¿Cómo puedo deserializar tal JSON en esta jerarquía de tipo Kotlin?
Si no desea escribir un serializador personalizado, debe hacer coincidir la estructura de su JSON. Su JSON original representa un objeto dentro de un objeto, por lo que tendrá que hacer algo como:
data class A(val value: AValue): Base() data class AValue(val aProp: Boolean)¡Buena pregunta! Me molesta tanto que todavía no haya un estándar para el polimorfismo en JSON.
No creo que escribir un serializador personalizado sea un enfoque deseable aquí. Tendría que aplicar serializadores personalizados en todo el código base. En su lugar, probablemente sea mejor que introduzca un paso de procesamiento previo y posterior cada vez que serialice JSON. Por lo tanto, intercepte el JSON y conviértalo a un formato compatible con kotlinx.serialization .
La serialización de Kotlinx también admite "polimorfismo de matriz" en la configuración JSON, que personalmente prefiero pero es mucho menos común. Almacena el tipo en el primer elemento y el valor en el segundo de una matriz. Esto parece similar en intención a su formato de destino. Con un transformador JSON, debería ser bastante trivial convertir todos los objetos de type y value en una matriz con dos elementos.
Ps. Le sugiero que publique sobre su caso de uso como una solicitud de función en GitHub. Los mantenedores son muy receptivos a la retroalimentación. Parece que algún tipo de patrón de estrategia para lidiar con diferentes formatos de polimorfismo está en orden.