使用 kotlinx.serialization 将 json 对象属性反序列化为字符串

Posted

技术标签:

【中文标题】使用 kotlinx.serialization 将 json 对象属性反序列化为字符串【英文标题】:Deserializing a json object property to a String using kotlinx.serialization 【发布时间】:2021-01-12 12:33:18 【问题描述】:

给定 json 如下,payload 对象的结构会有所不同:


    "id": 1,
    "displayName": "Success",
    "payload": 
        "someProperty": "example",
        "someOtherProperty": 
            "someNestedProperty": "example"
        
    

...使用kotlinx.serialization如何将其反序列化为以下数据类,其中payload的值应该是有效负载对象的原始json字符串。

@Serializable
data class Stub(
    val id: Int,
    val displayName: String,
    val payload: String
)

【问题讨论】:

【参考方案1】:

努力寻找一种使用序列化程序执行此操作的方法,但使用JsonElement 手动实现非常简单。

val jsonObject = Json.parseToJsonElement(jsonString).jsonObject
val stub = Stub(
    jsonObject["id"]!!.jsonPrimitive.int,
    jsonObject["displayName"]!!.jsonPrimitive.content,
    jsonObject["payload"]!!.toString()
)

【讨论】:

【参考方案2】:

有一种方法可以使用JSONTransformingSerializer 来处理。它允许您在反序列化之前转换 json。在这种情况下,从 jsonElement 转换为 jsonPrimitive(String 类型)。

首先创建一个transformer如下:

object JsonAsStringSerializer: JsonTransformingSerializer<String>(tSerializer = String.serializer()) 
    override fun transformDeserialize(element: JsonElement): JsonElement 
        return JsonPrimitive(value = element.toString())
    

现在通过添加...将此传输应用于数据类中的特定元素

@Serializable(with = JsonAsStringSerializer::class)

就在您要转换的属性上方。像这样……

@Serializable
data class Stub(
    val id: Int,
    val displayName: String,
    @Serializable(with = JsonAsStringSerializer::class)
    val payload: String
)

有效载荷的值将是一个字符串:

"'someProperty': 'example','someOtherProperty': 'someNestedProperty':'example'"

如果您稍后尝试根据结构将其反序列化为不同的模型,请查看JsonContentPolymorphicSerializer 功能。

【讨论】:

以上是关于使用 kotlinx.serialization 将 json 对象属性反序列化为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 kotlinx.serialization 部分解码 JSON 字符串?

Ktor 与 Kmongo 和 kotlinx.serialization

使用 kotlinx.serialization 在 ktor 服务器中接收 Map

在 Kotlin/Native 中使用 kotlinx.serialization 进行多态反序列化

如何将 Spring Boot 映射器从 Jackson 交换到 kotlinx.serialization

使用 Kotlinx.serialization 将 JSON 数组解析为 Map<String, String>