【问题标题】:Deserializing a json object property to a String using kotlinx.serialization使用 kotlinx.serialization 将 json 对象属性反序列化为字符串
【发布时间】: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
)

【问题讨论】:

    标签: json kotlin kotlinx.serialization


    【解决方案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 功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-03
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 2014-01-04
        • 2020-02-03
        相关资源
        最近更新 更多