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

Kotlin:将嵌套的JSON对象转换为文本字符串,json,kotlin,kotlinx.serialization,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 ) {

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

@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" }
}
序列化后,它会生成如下输出:

@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\" }"
}
我怎样才能在科特林做到这一点?只需
kotlinx.serialization
就可以完成,还是Jackson/Gson绝对必要

请注意,此输出用于特定用途。我无法覆盖基本序列化程序,因为我仍然需要从普通JSON进行序列化/反序列化(第一个示例)。换句话说,最好的场景是将第一个JSON样本转换为第二个样本,而不必让数据类直接生成第二个样本


谢谢

车辆创建自定义
序列化策略
,如下所示:

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))
        }
    }
}
结果:

{"color":"black","miles":35000,"year":2017,"garage":"{\"latitude\":43.47834,\"longitude\":-91.337,\"name\":\"Paul's Garage\"}"}

更多信息

非常感谢。我已经阅读了所有关于自定义序列化程序的文档,但正在努力构建一个基本的
KSerializer
,它没有点击我需要创建一个
SerializationStrategy
,直到你把它全部列出。非常好,谢谢。