我希望用Ktor在Kotlin中重写一个spring应用程序。我对Spring和Ktor都很陌生。
我很难使用Ktor来了解如何处理POJO的序列化和反序列化。(这些POJO是公共库的一部分)。
我试图用Ktor为请求提供服务的API使用:
例如,“数据/事件”将返回:
{
"data": [
{
"type": "event",
"id": "15b6c19a-6084-4e82-ada9-6c30e282191f",
"attributes": {
"imageUrl": null,
"name": "some text",
"type": "NUMERIC"
}
}, // and more event objects
]
}查看spring应用程序中的代码库,看起来他们使用一个RestTemplate将上面的代码反序列化为一个事件类(它只有一个id、imageUrl、名称和类型作为变量)。Spring似乎自动知道如何从JSON获得POJO。
我怎么能对Ktor做同样的事呢?我试过最简单的:
val response = client.request<List<Event>>("data/event")连载器为gson:
install(JsonFeature) {
serializer = GsonSerializer()
}但是这会导致一个事件对象列表,其中没有正确设置它们的变量。
我必须做一个包装类:
data class MyWrapper(val data: List<Event>)这样,它将使用id正确设置的对象填充列表,但没有其他属性。因此,默认情况下,Ktor似乎不是为JSON配置的。我怎么才能改变这个?
发布于 2020-10-07 20:20:30
我相信JSON:API是不受欢迎的。您需要编写自己的序列化程序,或者使用另一个包装类:
class JSONAPI<T>(val type: String, val id: String, val attributes: T)
data class MyWrapper(val data: List<JSONAPI<Event>>)这里的问题是,Event中除id之外的所有字段都将被填充。因此,您需要调整反序列化结果:
val response: List<Event> = client.request<MyWrapper>("data/event").data.filterNotNull().map { it.attributes.copy(id = it.id) }https://stackoverflow.com/questions/64247029
复制相似问题