json - Ktor:在多平台中以 List 为根序列化/反序列化 JSON
问题描述
我们如何使用 kotlin.serialize 和 Ktor 的 HttpClient 来反序列化/序列化 JSON 并以列表为根?我正在按如下方式创建 HttpClient:
HttpClient {
install(JsonFeature) {
serializer = KotlinxSerializer().apply {
setMapper(MyClass::class, MyClass.serializer())
setMapper(AnotherClass::class, AnotherClass.serializer())
}
}
install(ExpectSuccess)
}
似乎我需要为 List 设置映射器,但是这对于泛型是不可能的。我看到我可以使用 MyClass.serializer().list 为它获取序列化程序,但是将其注册为对 http 请求进行反序列化/序列化并不简单。有人知道一个好的解决方案吗?
解决方案
您可以编写包装器和自定义序列化程序:
@Serializable
class MyClassList(
val items: List<MyClass>
) {
@Serializer(MyClassList::class)
companion object : KSerializer<MyClassList> {
override val descriptor = StringDescriptor.withName("MyClassList")
override fun serialize(output: Encoder, obj: MyClassList) {
MyClass.serializer().list.serialize(output, obj.items)
}
override fun deserialize(input: Decoder): MyClassList {
return MyClassList(MyClass.serializer().list.deserialize(input))
}
}
}
注册它:
HttpClient {
install(JsonFeature) {
serializer = KotlinxSerializer().apply {
setMapper(MyClassList::class, MyClassList.serializer())
}
}
}
并使用:
suspend fun fetchItems(): List<MyClass> {
return client.get<MyClassList>(URL).items
}
推荐阅读
- amazon-web-services - AWS EKS - 获取可用的 Kubernetes 版本
- r - `renderDataTable` 和 `renderUI` 具有不同顺序的奇怪问题
- directshow - 为什么 SampleGrabber::SampleCB 只调用一次而不调用 SetSyncSource(NULL)
- c# - Picturebox按住鼠标按钮后更改图片并释放鼠标后重新更改C#
- r - 更改 jupyter notebook 主题以突出显示 R 功能
- javascript - 如何使用 Selenium 从页面滚动特定 div?
- android - 由于类型不匹配,无法在 Flow 中发出 Either.Left
- typescript - Vue 3 使用 v-model 作为 props 而不是 :prop 和 @emit
- javascript - 为什么在某些情况下“鼠标悬停”不能模拟悬停?
- java - 如何在 netbeans 12.4 中启用本机打包