use*_*706 11 json kotlin kotlinx.serialization
给定如下 json,其中payload对象的结构会有所不同:
{
"id": 1,
"displayName": "Success",
"payload": {
"someProperty": "example",
"someOtherProperty": {
"someNestedProperty": "example"
}
}
}
Run Code Online (Sandbox Code Playgroud)
...使用kotlinx.serialization如何将其反序列化为以下数据类,其中 的值payload应该是有效负载对象的原始 json 字符串。
@Serializable
data class Stub(
val id: Int,
val displayName: String,
val payload: String
)
Run Code Online (Sandbox Code Playgroud)
use*_*706 16
努力寻找一种使用序列化器来执行此操作的方法,但使用JsonElement.
val jsonObject = Json.parseToJsonElement(jsonString).jsonObject
val stub = Stub(
jsonObject["id"]!!.jsonPrimitive.int,
jsonObject["displayName"]!!.jsonPrimitive.content,
jsonObject["payload"]!!.toString()
)
Run Code Online (Sandbox Code Playgroud)
小智 11
有一种方法可以使用JSONTransformingSerializer进行处理。它允许您在反序列化之前转换 json。在本例中,从 jsonElement 转换为 jsonPrimitive(字符串类型)。
首先创建一个变压器如下:
object JsonAsStringSerializer: JsonTransformingSerializer<String>(tSerializer = String.serializer()) {
override fun transformDeserialize(element: JsonElement): JsonElement {
return JsonPrimitive(value = element.toString())
}
}
Run Code Online (Sandbox Code Playgroud)
现在通过添加以下内容将此传输应用于数据类中的特定元素...
@Serializable(with = JsonAsStringSerializer::class)
Run Code Online (Sandbox Code Playgroud)
就在您要转换的属性上方。像这样...
@Serializable
data class Stub(
val id: Int,
val displayName: String,
@Serializable(with = JsonAsStringSerializer::class)
val payload: String
)
Run Code Online (Sandbox Code Playgroud)
有效负载的值将是一个字符串:
"{'someProperty': 'example','someOtherProperty': {'someNestedProperty':'example'}"
Run Code Online (Sandbox Code Playgroud)
如果您稍后尝试根据结构将其反序列化为不同的模型,请查看JsonContentPolymorphicSerializer功能。
| 归档时间: |
|
| 查看次数: |
13866 次 |
| 最近记录: |