Как избежать получения дополнительного поля со случайной информацией при использовании подтипов Джексона? - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь использовать JSON подтипов, чтобы создать своего рода "generi c" получателей объекта для различных событий.

На данный момент у меня есть что-то вроде этого:

 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "color")
    @JsonSubTypes(
            JsonSubTypes.Type(value = Color::class, name = "RED"),
            JsonSubTypes.Type(value = Color::class, name = "YELLOW"),
            JsonSubTypes.Type(value = SpecialColor::class, name = "SPECIAL_1"),
            JsonSubTypes.Type(value = SpecialColor::class, name = "SPECIAL_2"),
            JsonSubTypes.Type(value = CustomColor::class, name = "CUSTOM")
        )


    interface EventColor{
        val eventId: String
        val color: ColorType
    }

    enum class ColorType {
        RED, YELLOW
    }

, тогда у меня есть мои объекты

data class Color(
    @get:JsonProperty override val eventId: String,
    @get:JsonProperty override val color: ColorType
): EventColor

проблема возникает, когда я делаю новый экземпляр Color

Color("123", ColorType.RED)

когда я печатаю объект, я получаю правильную информацию

Color(eventId=event123, ColorType.RED)

, но когда я делаю

private val mapper = jacksonObjectMapper()
val mapped = mapper.writeValueAsString(myObject)

и печатаю свой объект, я получаю это

{"color":"RED","eventId":"event123","color":"YELLOW"}

это импорт для моего картографа

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

Я понятия не имею, что происходит или как это вообще возможно, есть идеи, что я могу делать неправильно?

1 Ответ

1 голос
/ 10 февраля 2020

Эти две аннотации @JsonSubTypes.Type с одним и тем же классом не имеют смысла. Я ожидал ошибку, но, видимо, они не тестировали этот сценарий, а первый просто игнорируется. Таким образом, ваша аннотация говорит: «при сериализации EventColor, если это Color, добавьте "color":"YELLOW"» (и при десериализации EventColor, сделайте его Color, если у него "color":"YELLOW").

Если Color действительно единственная реализация EventColor, я считаю, что правильная аннотация -

@JsonTypeInfo(use = JsonTypeInfo.Id.NONE, defaultImpl = Color::class)
interface EventColor{
    val eventId: String
    val color: ColorType
}

Или просто удалите интерфейс и используйте Color напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...