Kotlin - сериализация JSON Array для нескольких классов - PullRequest
0 голосов
/ 01 апреля 2019

Я бы хотел проанализировать JSON Array (в String) в Kotlin Array нескольких классов. Можно ли сделать сериализацию, как показано ниже? Я использую kotlinx.serialization , но при необходимости могу использовать другие библиотеки.

abstract class DataTypeBase(val dataType: DataTypeEnum) {
    abstract fun doSomething()
}

@Serializable
data class DataTypeA(dataType: DataTypeEnum, val a: String): DataTypeBase(dataType) {}

@Serializable
data class DataTypeB(dataType: DataTypeEnum, val b: Int) : DataTypeBase(dataType) {}

fun customSerializer(): KSerializer {
    when (json.dataType) {
        DataTypeEnum.A -> return DataTypeA.serializer()
        DataTypeEnum.B -> return DataTypeB.serializer()
    }
}

fun run() {
    val dataArray: Array<DataTypeBase> = 
         Json().parse(ArrayListSerializer(customSerializer(), jsonArrayInString) 
}

Например,

[{ dataType: "A", a: "text" }, { dataType: "B", b: 123 }]

становится

Array[0] : DataTypeA("A", "text")
Array[1] : DataTypeB("B", 123)

1 Ответ

0 голосов
/ 11 мая 2019

Вы можете использовать следующее:

@Serializable
abstract class DataTypeBase()

@Serializable
data class DataTypeA(val a: String) : DataTypeBase()

@Serializable
data class DataTypeB(val b: Int) : DataTypeBase()

fun main() {
    val format = Json(context = SerializersModule {
        polymorphic(DataTypeBase::class) {
            DataTypeA::class with DataTypeA.serializer()
            DataTypeB::class with DataTypeB.serializer()
        }
    })
    val string = format.stringify(DataTypeBase.serializer().list, listOf(DataTypeA("text"), DataTypeB(123)))
    println(string)
    println(format.parse(PolymorphicSerializer(DataTypeBase::class).list, string))
}

выход

[{"type":"DataTypeA","a":"text"},{"type":"DataTypeB","b":123}]
[DataTypeA(a=text), DataTypeB(b=123)]
...