ktor动态密钥序列化和json预处理



Ktor中是否有任何东西可以在反序列化过程之前更改json?在下面的例子中,有一个带有动态键的json,我需要在其中删除";令牌";键,因为它是字符串类型,而不是其他键的对象类型。当我转换代码时,我得到以下错误:

Exception in thread "main" kotlinx.serialization.json.internal.JsonDecodingException: Expected class kotlinx.serialization.json.JsonObject as the serialized body of shell.remoting.Market, but had class kotlinx.serialization.json.JsonLiteral

我不确定是否还有更好的方法。任何建议都将不胜感激,谢谢

object MarketMapSerializer :
JsonTransformingSerializer<Map<String, Market>>(MapSerializer(String.serializer(), Market.serializer())) {
override fun transformSerialize(element: JsonElement): JsonElement =
JsonObject(element.jsonObject.filterNot { (k, _) ->
k == "token"
})
}
@Serializable
data class Market(
val stations: List<Station>,
)
@Serializable
data class Station(
@JsonNames("iata_code")
val iataCode: String,
val destinations: List<String>,
)

fun main() {
val jsonString = """
{
"Republica Dominicana": {
"stations": [
{
"iata_code": "PUJ",
"destinations": [
"ADZ",
"BAQ",
"VVC"
]
}
]
},
"Brasil": {
"stations": [
{
"iata_code": "AJO",
"destinations": [
"ADZ",
"BAQ",
"VVC"
]
}
]
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3RSRVogQVBJIiwianRpIjoiYTVhZDM4NmYtOGViNy0yOWQ5LWZkMGYtM2Q3MzQwZmRhOGI2IiwiaXNzIjoiZG90UkVaIEFQSSJ9.V2YfXCt9r7Tzae9SYSoj-qIyxjRc9YoE2XPoIQQNI9U"
}
""".trimIndent()
println(
Json.decodeFromString(
MarketMapSerializer,
jsonString
)
)
}

只需将transformSerialize替换为transformDeserialize,因为您正在进行反序列化。

最新更新