Nano Hash - криптовалюты, майнинг, программирование

Включить имя класса (класс данных Kotlin) в ответ JSON в Quarkus

Я новичок в Quarkus и Kotlin, и, по правде говоря, я еще не совсем уверен, что происходит за кулисами и какая библиотека JSON на самом деле отвечает за рендеринг ответа JSON от ресурса, когда я устанавливаю @Produces(MediaType.APPLICATION_JSON) для своей функции. Но я возвращаю экземпляр класса данных, который я создал из этого метода, и все поля этого класса данных отображаются в ответе. Однако у меня есть несколько классов ответа, и я хотел бы включить имя класса в ответ JSON. Теперь у меня есть поле String, которое просто жестко закодировано для имени класса, но это некрасиво, поскольку мне приходится повторять имя класса:

data class StuffInitiatedResponse (
    val id: String,
    val projectId: String
) {
    val operation = "StuffInitiatedResponse"
}

data class StuffCompletedResponse (
    val id: String,
    val projectId: String,
) {
    val operation = "StuffCompletedResponse"
}

А в моем классе обслуживания:

@Path("/myservice")
class MyService {

    @POST
    @Path("{project}/{path:.*}")
    @Produces(MediaType.APPLICATION_JSON)
    fun initiateStuff(@PathParam project: String,
                      @PathParam path: String,
                      @QueryParam("completedId") completedId: String?) : StuffInitiatedResponse {
        
        if (completedId == null) {
            println("I've initiated stuff")
            return StuffInitiatedResponse(UUID.randomUUID().toString(), project)
        } else {
            println("I've completed stuff")
            return StuffCompletedResponse(completedId, project)
        }
    }
}

Это дает то, что я ожидал, но, как я уже сказал, меня раздражает то, что мне приходится повторять имя класса в поле ответа классов данных. Есть ли способ встроить имя класса в JSON?

06.01.2021

Ответы:


1

Библиотека JSON зависит от определенных вами зависимостей. Это может быть либо Джексон, либо Яссон.

Я рекомендую использовать Джексона, и в этом случае вы можете использовать аннотацию @JsonTypeInfo для своих сериализованных классов, у которой есть некоторые параметры для включения типа в вывод JSON.

06.01.2021
  • Я должен был заметить, что объявляю зависимость от quarkus-resteasy-jsonb. Не уверен, относится ли это к Джексону или Яссону, или это совсем другое. Я попытался аннотировать свои классы данных с помощью @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "operation") , но это не сработало. 06.01.2021
  • ааа ... вот оно! Изменил мою зависимость с quarkus-resteasy-jsonb на quarkus-resteasy-jackson, и это заставило работать аннотацию JsonTypeInfo. Понятия не имею, какая разница между jsonb и jackson здесь, но я буду придерживаться jackson, поскольку считаю, что он более зрелый и, следовательно, более документированный. 06.01.2021
  • Это две совершенно разные реализации парсера / сериализатора JSON. В настоящее время мы рекомендуем использовать Jackson с Quarkus. 06.01.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..