如何使用 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 序列化:如何绕过 reified typeargs 进行反序列化?
kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList<Date> 序列化为数据类变量