1

我想将 JSON Array(in 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)
4

1 回答 1

1

您可以使用以下内容:

@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)]
于 2019-05-11T19:43:48.903 回答