Анализ NonEmptyList непосредственно из JSON

Учитывая этот JSON: [{"name": "test"}]. Есть ли способ проанализировать этот массив JSON непосредственно в Arrow NonEmptyList?

У меня есть Scala, и я изучаю Ktor + Arrow. У меня есть конечная точка, которую я хотел бы сделать что-то вроде: call.receive<NonEmptyList<DataClass>>(). Однако кажется, что, поскольку сериализация основана на аннотации, без класса данных с @Serializable похоже, что он не знает, как анализировать JSON даже с @file:UseSerializers(NonEmptyListSerializer::class) в файле.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
226
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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
     }
  }
}

В связанной документации объясняется, как добавить типы стрелок в класс данных, помеченный @Serializable. Я говорю о том, когда у вас нет класса данных, но вы хотите напрямую проанализировать NonEmptyList. Если вы попытаетесь сделать это, например: Json.decodeFromString<NonEmptyList<String>>("""["test"]"""), вы получите kotlinx.serialization.SerializationException: Serializer for class 'NonEmptyList' is not found. даже с @file:UseSerializers(NonEmptyListSerializer::class) в верхней части файла. В конце концов я пытаюсь использовать Ktor's call.receive<NonEmptyList<...>>.

LightSystem 29.04.2024 04:26
Ответ принят как подходящий

После некоторого исследования с помощью указателей @nomisRev при использовании Ktor и установке сериализатора JSON я пришел к следующему:

install(ContentNegotiation) {
    json(Json {
        serializersModule =
            SerializersModule { contextual(NonEmptyList::class) { args -> NonEmptyListSerializer(args[0]) } }
    })
}

https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#contextual-serialization-and-generic-classes

Это рассматривается в Arrow: https://github.com/arrow-kt/arrow/pull/3413

Другие вопросы по теме

Как я могу оптимизировать получение данных на моем внутреннем сервере KTOR при обработке запросов API?
Перенаправить обратно на начальную страницу после входа в форму в KTOR?
Откуда импортировать сериализацию JSON при работе с Ktor
Gcloud.app.deploy Ответ на ошибку: [13] учетная запись службы Cloud Build по умолчанию или указанная пользователем учетная запись службы не имеют доступа к корзине
Обработка временного перенаправления 307 в Ktor HttpClient на iOS с помощью Kotlin Multiplatform
Как расшифровать и использовать зашифрованный ответ в HTTP-клиенте Ktor
Ktor ClientRequestException — получить сообщение сервера, встроенное в сообщение ClientRequestException
Сеанс аутентификации ведет себя не так, как предполагалось, когда он завернут в «authenticate(»auth-session») в моем приложении
Готов ли okhttp4 для Kotlin Multiplatform Mobile?
Почему мой модульный тест Ktor выдает исключение, а не возвращает ответ с кодом состояния 500?