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

时间:2020-10-22 08:39:25

标签: 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来完成吗,还是杰克逊/格森绝对必要?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

True创建自定义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)

更多信息here

相关问题