【问题标题】:Kotlin - Serialize JSON Array to multiple classesKotlin - 将 JSON 数组序列化为多个类
【发布时间】:2019-04-01 06:17:29
【问题描述】:

我想将 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)

【问题讨论】:

    标签: serialization kotlin deserialization kotlin-extension json-serialization


    【解决方案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)]
    

    【讨论】:

    • 除了serialization.*serialization.json.* 之外,还需要哪些导入?这让我说 Cannot access '&lt;init&gt;': it is protected in 'Json' 时出错。
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2021-01-30
    • 2016-09-15
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多