如何使用 kotlinx 序列化将值数组反序列化为集合

Posted

技术标签:

【中文标题】如何使用 kotlinx 序列化将值数组反序列化为集合【英文标题】:How to deserialize an array of values into a collection using kotlinx serialization 【发布时间】:2021-03-25 17:14:15 【问题描述】:

您好,我是 kotlinx 序列化的新手,我正在使用 KMP,我的要求有点不同

我的数据类

@Serializable 数据类 Student(val name : String , val age : Int)

而我的简单 JSON 将是“['Avinash', 22]”,

应该反序列化为 Student("Avinash", 22)

我无法反序列化它,任何人都可以帮助我

【问题讨论】:

正如其他人指出的那样,您的“简单 JSON”不是格式良好的 JSON 【参考方案1】:

虽然[Avinash, 22] 等输入不是格式正确的 Json,但您仍然可以 通过将其解析为 JsonElement 来使用它:

import kotlinx.serialization.json.*

data class Student(val name: String, val age: Int)

fun decode(stringData: String, parser: Json): List<Student> 
    val element: JsonArray = parser.parseToJsonElement(stringData).jsonArray
    return element.windowed(2, 2).map 
        Student(
            it[0].toString(),
            it[1].toString().toInt()
        )
    


fun main() 
    val parser = Json  isLenient = true 
    val students = decode("[A, 22, B, 33, C, 44]", parser)
    println(students)
    // [Student(name=A, age=22), Student(name=B, age=33), Student(name=C, age=44)]


【讨论】:

【参考方案2】:

试试这个:

val student: Student = Json.decodeFromString("\"name\": \"Avinash\", \"age\": \"22\"")

注意如何格式化你的 JSON 字符串。

[] 方括号用于数组 大括号用于对象

并且你必须提供你的字段名称,并为字段和值使用双引号,或者使用不太严格的Json 反序列化:

val json = Json 
    isLenient = true

val student: Student = json.decodeFromString("name: Avinash, age: 22")

如果您想深入了解 json 架构,可以阅读 here。

【讨论】:

嗨@shadowsheep,谢谢你的建议:),我实际上需要将值数组反序列化为一个对象,我们试图减少数据使用量,所以我们得到数组中的值相同我要求。有什么办法吗? @avinashsaipavanmunnangi 这是一种反序列化对象的非标准方式。实际上,我首先想到的是将其反序列化为字符串数组,然后编写自定义映射函数来创建对象。

以上是关于如何使用 kotlinx 序列化将值数组反序列化为集合的主要内容,如果未能解决你的问题,请参考以下文章

使用 kotlinx.serialization 库反序列化具有不同值类型的 JSON 数组

如何使用 kotlinx.serialization 将库类序列化为 Protobuf?

Kotlinx 将 JSON Array 序列化为数据类

Kotlinx 序列化:如何绕过 reified typeargs 进行反序列化?

kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList<Date> 序列化为数据类变量

将空 JSON 数组反序列化为空 TreeMap