首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用kotlinx.serialization在ktor服务器中接收地图

使用kotlinx.serialization在ktor服务器中接收地图
EN

Stack Overflow用户
提问于 2020-03-31 08:06:16
回答 1查看 888关注 0票数 0

我有一个运行在kotlinx.serialization上的Ktor服务器,因为它是json (反)序列化程序,我给我的Ktor发送了一条类似这样的消息:

代码语言:javascript
复制
{
  "Brick(partNumber=004229, partName=Sticker Sheet for Set 295-1, dataSource=Rebrickable, brickImage=null, categoryID=58)": 5
}

它是一对Int和这个类:

代码语言:javascript
复制
import kotlinx.serialization.Serializable

@Serializable
data class Brick(
    val partNumber: String,
    val partName: String,
    val dataSource: String,
    val brickImage: String?,
    val categoryID: Int?
)

但是我得到了这个错误

代码语言:javascript
复制
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。编辑:在进一步检查时,它会在行首使用[而不是{。我的(部分)应用程序实现

代码语言:javascript
复制
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):

代码语言:javascript
复制
    @POST("/user/brick")
    suspend fun setBricksAmounts(
        @Query("userName")
        userName: String,
        @Body
        brickAmounts: Map<Brick, Int>
    )
EN

回答 1

Stack Overflow用户

发布于 2020-03-31 19:49:22

我认为使用一个类作为键在kotlinx序列化中是行不通的,看起来这个类只是被序列化为一个字符串来使用它作为键。

相反,您可以将其作为Map<String, Int>接收,然后运行

代码语言:javascript
复制
bricks.mapKeys { (jsonString, number) ->
   Json(JsonConfiguration.Stable).parse(Brick.Serializer, jsonString)
}

或者等效的jackson代码,如果你想

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60941456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档