Учитывая этот JSON: [{"name": "test"}]
.
Есть ли способ проанализировать этот массив JSON непосредственно в Arrow NonEmptyList?
У меня есть Scala, и я изучаю Ktor + Arrow.
У меня есть конечная точка, которую я хотел бы сделать что-то вроде: call.receive<NonEmptyList<DataClass>>()
.
Однако кажется, что, поскольку сериализация основана на аннотации, без класса данных с @Serializable
похоже, что он не знает, как анализировать JSON даже с @file:UseSerializers(NonEmptyListSerializer::class)
в файле.
Arrow-kt имеет встроенную поддержку сериализации KotlinX. Это объясняется здесь, в документации, https://arrow-kt.io/learn/quickstart/serialization/.
Его можно добавить через координаты maven io.arrow-kt:arrow-core-serialization:$version
.
Обновлено:
Если вы не управляете data class
, но полиморфно десериализуете JSON, вам необходимо зарегистрировать сериализацию в SerializersModule. KotlinX использует отражение для поиска сериализаторов, но не выполняет сканирование путей к классам, поэтому не может автоматически обнаружить NonEmptyListSerializer. @file работает только тогда, когда вы добавляете его в файл, который определяет класс данных, как вы сказали.
Таким образом, чтобы KotlinX нашел полиморфный сериализатор, вам необходимо использовать модуль сериализаторов KotlinX. https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#merging-library-serializers-modules
Итак в Ктор:
install(ContentNegotation) {
json {
serializersModule = SerializersModule {
// register serialises
}
}
}
После некоторого исследования с помощью указателей @nomisRev при использовании Ktor и установке сериализатора JSON я пришел к следующему:
install(ContentNegotiation) {
json(Json {
serializersModule =
SerializersModule { contextual(NonEmptyList::class) { args -> NonEmptyListSerializer(args[0]) } }
})
}
Это рассматривается в Arrow: https://github.com/arrow-kt/arrow/pull/3413
В связанной документации объясняется, как добавить типы стрелок в класс данных, помеченный
@Serializable
. Я говорю о том, когда у вас нет класса данных, но вы хотите напрямую проанализироватьNonEmptyList
. Если вы попытаетесь сделать это, например:Json.decodeFromString<NonEmptyList<String>>("""["test"]""")
, вы получитеkotlinx.serialization.SerializationException: Serializer for class 'NonEmptyList' is not found.
даже с@file:UseSerializers(NonEmptyListSerializer::class)
в верхней части файла. В конце концов я пытаюсь использовать Ktor'scall.receive<NonEmptyList<...>>
.