我有一个运行在kotlinx.serialization上的Ktor服务器,因为它是json (反)序列化程序,我给我的Ktor发送了一条类似这样的消息:
{
"Brick(partNumber=004229, partName=Sticker Sheet for Set 295-1, dataSource=Rebrickable, brickImage=null, categoryID=58)": 5
}它是一对Int和这个类:
import kotlinx.serialization.Serializable
@Serializable
data class Brick(
val partNumber: String,
val partName: String,
val dataSource: String,
val brickImage: String?,
val categoryID: Int?
)但是我得到了这个错误
kotlinx.serialization.json.JsonDecodingException: Invalid JSON at 0: Expected '[, kind: MAP'
at kotlinx.serialization.json.internal.JsonReader.fail(JsonReader.kt:293)对我来说,这意味着kotlinx.serialization期望映射类使用不同的语法。这对我来说很奇怪。当我将类型改为List>时,它抛出了相同的异常,但使用的是LIST而不是MAP。编辑:在进一步检查时,它会在行首使用[而不是{。我的(部分)应用程序实现
fun Application.module(testing: Boolean = false) {
install(ContentNegotiation) { serialization() }
routing {
route("user") {
route("brick") {
post {
call.request.queryParameters["userName"]
?.let { userRepository.login(it) } // Someone else is still working login nvm this
?.let { user ->
val bricks = call.receive<Map<Brick, Int>>() // This throws an error
userRepository.addBricks(user, bricks)
call.respond(HttpStatusCode.OK)
}
?: call.respond(HttpStatusCode.Unauthorized)
}
}
}
}
}发送类的android改造函数(使用GSON):
@POST("/user/brick")
suspend fun setBricksAmounts(
@Query("userName")
userName: String,
@Body
brickAmounts: Map<Brick, Int>
)发布于 2020-03-31 19:49:22
我认为使用一个类作为键在kotlinx序列化中是行不通的,看起来这个类只是被序列化为一个字符串来使用它作为键。
相反,您可以将其作为Map<String, Int>接收,然后运行
bricks.mapKeys { (jsonString, number) ->
Json(JsonConfiguration.Stable).parse(Brick.Serializer, jsonString)
}或者等效的jackson代码,如果你想
https://stackoverflow.com/questions/60941456
复制相似问题