首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何序列化/反序列化JSON (vnd.api+json)

如何序列化/反序列化JSON (vnd.api+json)
EN

Stack Overflow用户
提问于 2020-10-07 15:12:10
回答 1查看 424关注 0票数 0

我希望用Ktor在Kotlin中重写一个spring应用程序。我对Spring和Ktor都很陌生。

我很难使用Ktor来了解如何处理POJO的序列化和反序列化。(这些POJO是公共库的一部分)。

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

例如,“数据/事件”将返回:

代码语言:javascript
复制
{
  "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做同样的事呢?我试过最简单的:

代码语言:javascript
复制
val response = client.request<List<Event>>("data/event")

连载器为gson:

代码语言:javascript
复制
    install(JsonFeature) {
        serializer = GsonSerializer()
    }

但是这会导致一个事件对象列表,其中没有正确设置它们的变量。

我必须做一个包装类:

代码语言:javascript
复制
data class MyWrapper(val data: List<Event>)

这样,它将使用id正确设置的对象填充列表,但没有其他属性。因此,默认情况下,Ktor似乎不是为JSON配置的。我怎么才能改变这个?

EN

回答 1

Stack Overflow用户

发布于 2020-10-07 20:20:30

我相信JSON:API是不受欢迎的。您需要编写自己的序列化程序,或者使用另一个包装类:

代码语言:javascript
复制
class JSONAPI<T>(val type: String, val id: String, val attributes: T)
data class MyWrapper(val data: List<JSONAPI<Event>>)

这里的问题是,Event中除id之外的所有字段都将被填充。因此,您需要调整反序列化结果:

代码语言:javascript
复制
 val response: List<Event> = client.request<MyWrapper>("data/event").data.filterNotNull().map { it.attributes.copy(id = it.id) }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64247029

复制
相关文章

相似问题

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