使用 kotlinx.serialization 将 json 对象 属性 反序列化为字符串
Deserializing a json object property to a String using kotlinx.serialization
鉴于 json 如下 payload
对象的结构将有所不同:
{
"id": 1,
"displayName": "Success",
"payload": {
"someProperty": "example",
"someOtherProperty": {
"someNestedProperty": "example"
}
}
}
...使用 kotlinx.serialization
如何将其反序列化为以下数据 class,其中 payload
的值应该是 json 的原始字符串负载对象。
@Serializable
data class Stub(
val id: Int,
val displayName: String,
val payload: String
)
努力寻找一种使用序列化器执行此操作的方法,但使用 JsonElement
.
手动实现它足够简单
val jsonObject = Json.parseToJsonElement(jsonString).jsonObject
val stub = Stub(
jsonObject["id"]!!.jsonPrimitive.int,
jsonObject["displayName"]!!.jsonPrimitive.content,
jsonObject["payload"]!!.toString()
)
有一种方法可以使用 JSONTransformingSerializer 来处理。它允许您在反序列化之前转换 json。在这种情况下,从 jsonElement 到 jsonPrimitive(String 类型)。
首先创建一个transformer如下:
object JsonAsStringSerializer: JsonTransformingSerializer<String>(tSerializer = String.serializer()) {
override fun transformDeserialize(element: JsonElement): JsonElement {
return JsonPrimitive(value = element.toString())
}
}
现在通过添加...
将此传输应用到数据中的特定元素 class
@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 功能。
鉴于 json 如下 payload
对象的结构将有所不同:
{
"id": 1,
"displayName": "Success",
"payload": {
"someProperty": "example",
"someOtherProperty": {
"someNestedProperty": "example"
}
}
}
...使用 kotlinx.serialization
如何将其反序列化为以下数据 class,其中 payload
的值应该是 json 的原始字符串负载对象。
@Serializable
data class Stub(
val id: Int,
val displayName: String,
val payload: String
)
努力寻找一种使用序列化器执行此操作的方法,但使用 JsonElement
.
val jsonObject = Json.parseToJsonElement(jsonString).jsonObject
val stub = Stub(
jsonObject["id"]!!.jsonPrimitive.int,
jsonObject["displayName"]!!.jsonPrimitive.content,
jsonObject["payload"]!!.toString()
)
有一种方法可以使用 JSONTransformingSerializer 来处理。它允许您在反序列化之前转换 json。在这种情况下,从 jsonElement 到 jsonPrimitive(String 类型)。
首先创建一个transformer如下:
object JsonAsStringSerializer: JsonTransformingSerializer<String>(tSerializer = String.serializer()) {
override fun transformDeserialize(element: JsonElement): JsonElement {
return JsonPrimitive(value = element.toString())
}
}
现在通过添加...
将此传输应用到数据中的特定元素 class@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 功能。