json - Kotlin:将嵌套的JSON对象转换为文字字符串

标签 json kotlin kotlinx.serialization

我有一个数据类,它具有一个属性,其类型是另一个数据类,如下所示:

@Serializable
data class Vehicle (
  val color: String,
  val miles: Int,
  val year: Int,
  val garage: Garage
)

@Serializable
data class Garage (
  val latitude: Float,
  val longitude: Float,
  val name: String
)
序列化后,它将产生如下输出:
{ 
  "color" : "black" , 
  "miles" : 35000 , 
  "year" : 2017 , 
  "garage" : { "latitude" : 43.478342 , "longitude" : -91.337000 , "name" : "Paul's Garage" }
}
但是我希望garage是其JSON表示形式的文字字符串,而不是实际的JSON对象。换句话说,所需的输出是:
{ 
  "color" : "black" , 
  "miles" : 35000 , 
  "year" : 2017 , 
  "garage" : "{ \"latitude\" : 43.478342 , \"longitude\" : -91.337000 , \"name\" : \"Paul's Garage\" }"
}
我如何在Kotlin做到这一点?可以只用kotlinx.serialization来完成吗,还是Jackson / Gson绝对必要?
请注意,此输出用于特定用途。我无法覆盖基本的序列化程序,因为我仍然需要从常规JSON进行序列化/反序列化(第一个示例)。换句话说,最好的情况是将第一个JSON样本转换为第二个JSON样本,而不必让数据类直接生成第二个样本。
谢谢!

最佳答案

SerializationStrategy创建一个自定义Vehicle,如下所示:

val vehicleStrategy = object : SerializationStrategy<Vehicle> {
    override val descriptor: SerialDescriptor
        get() = buildClassSerialDescriptor("Vehicle") {
            element<String>("color")
            element<Int>("miles")
            element<Int>("year")
            element<String>("garage")
        }

    override fun serialize(encoder: Encoder, value: Vehicle) {
        encoder.encodeStructure(descriptor) {
            encodeStringElement(descriptor, 0, value.color)
            encodeIntElement(descriptor, 1, value.miles)
            encodeIntElement(descriptor, 2, value.year)
            encodeStringElement(descriptor, 3, Json.encodeToString(value.garage))
        }
    }
}
然后将其传递给Json.encodeToString():
val string = Json.encodeToString(vehicleStrategy, vehicle)
结果:
{"color":"black","miles":35000,"year":2017,"garage":"{\"latitude\":43.47834,\"longitude\":-91.337,\"name\":\"Paul's Garage\"}"}
更多信息here

关于json - Kotlin:将嵌套的JSON对象转换为文字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64478425/

相关文章:

kotlin - Mongo 和 Kotlin 的委托(delegate)问题

mysql - 将 MySQL 中的 JSON 数组转换为行

kotlin - 如何结束/关闭 MutableSharedFlow?

javascript - Angular JS 将 html 发送到数据库

android - 如何在 Kotlin 中使用密封类实现 ViewHolder

android - 如何在 android 中使用 Dagger 对 kotlin 文件进行 UI 测试?

kotlin - Ktor HttpClient JsonFeature 可以使用 kotlinx.serialization

android - 使用 Ktor 反序列化 Json 数组的问题

json - 如何正确编写主题和订阅的 ARM 模板

javascript - 将 List<KeyValuePair<string,string>> 传递给 WebAPI 会得到空值