4

给定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
)
4

2 回答 2

6

努力寻找一种使用序列化器执行此操作的方法,但它很简单,可以手动使用JsonElement.

val jsonObject = Json.parseToJsonElement(jsonString).jsonObject
val stub = Stub(
    jsonObject["id"]!!.jsonPrimitive.int,
    jsonObject["displayName"]!!.jsonPrimitive.content,
    jsonObject["payload"]!!.toString()
)
于 2020-09-26T19:14:54.290 回答
2

有一种使用JSONTransformingSerializer处理的方法。它允许您在反序列化之前转换 json。在这种情况下,从 jsonElement 到 jsonPrimitive(字符串类型)。

首先创建一个变压器,如下所示:

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功能。

于 2021-12-15T19:40:02.117 回答