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

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

我的数据类

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

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

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

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

【问题讨论】:

  • 正如其他人指出的那样,您的“简单 JSON”不是格式良好的 JSON

标签: kotlin deserialization kotlinx.serialization


【解决方案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 这是一种反序列化对象的非标准方式。实际上,我首先想到的是将其反序列化为字符串数组,然后编写自定义映射函数来创建对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2018-11-20
    • 2019-06-17
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多