Ktor:如何序列化/反序列化JSON-API(vnd.API+;JSON)

Ktor:如何序列化/反序列化JSON-API(vnd.API+;JSON),json,rest,kotlin,ktor,Json,Rest,Kotlin,Ktor,我希望使用Ktor在Kotlin中重写SpringJavaFX应用程序。我对Spring和Ktor都是新手 我在使用Ktor找出如何实现POJO的序列化和反序列化时遇到了问题。(这些POJO是公共库的一部分) 我试图通过Ktor为请求提供服务的API使用: 将ORM休眠为ORM映射器 Elide提供RSQL过滤器 例如,“数据/事件”将返回: { "data": [ { "type": "event",

我希望使用Ktor在Kotlin中重写SpringJavaFX应用程序。我对Spring和Ktor都是新手

我在使用Ktor找出如何实现POJO的序列化和反序列化时遇到了问题。(这些POJO是公共库的一部分)

我试图通过Ktor为请求提供服务的API使用:

  • 将ORM休眠为ORM映射器
  • Elide提供RSQL过滤器
例如,“数据/事件”将返回:

{
  "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-API获取POJO

我如何对Ktor进行同样的操作?我尝试了最简单的方法:

val response = client.request<List<Event>>("data/event")
但这会导致事件对象列表中没有正确设置变量

我必须创建一个包装类:

data class MyWrapper(val data: List<Event>)
数据类MyWrapper(val数据:列表)

这样,它将使用正确设置的对象
id
填充列表,但不会填充其他属性。因此,默认情况下,Ktor似乎没有为JSON-API配置。我该如何改变这一点呢?

我认为JSON:API不受开箱即用的支持。您需要编写自己的序列化程序,或使用其他包装器类:

data class MyWrapper(val data: List<Event>)
classjsonapi(val类型:String,val id:String,val属性:T)
数据类MyWrapper(val数据:列表)
这里的问题是
事件
中除
id
之外的所有字段都将被填充。因此,您需要调整反序列化结果:

val响应:List=client.request(“数据/事件”).data.filterNotNull().map{it.attributes.copy(id=it.id)}