Json 在使用jackson子类型时,如何避免获得包含随机信息的额外字段?

Json 在使用jackson子类型时,如何避免获得包含随机信息的额外字段?,json,kotlin,jackson,Json,Kotlin,Jackson,我试图使用JSON子类型为不同事件创建某种“通用”对象收件人 目前我有这样的想法: @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "color") @JsonSubTypes( JsonSubTypes.Type(value = Color::class, name = "RED"), JsonSubType

我试图使用JSON子类型为不同事件创建某种“通用”对象收件人

目前我有这样的想法:

 @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("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

我不知道发生了什么或者这是怎么可能的,知道我可能做错了什么吗?

这两个注释
@JsonSubTypes.Type
使用同一个类没有意义。我预计会出现错误,但显然他们没有测试这个场景,第一个场景被忽略了。因此,您的注释是“序列化
EventColor
时,如果它是
Color
,请添加
“Color”:“YELLOW”
”(反序列化
EventColor
时,如果它有
“Color”:“YELLOW”
,则将其设置为
Color

如果
Color
确实是
EventColor
的唯一实现,我相信正确的注释是

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

或者直接删除接口并使用
Color

感谢@Alexey的回复,不幸的是,Color不是EventColor的唯一实现,因为还有一些其他的实现,一些ColorType共享同一类,因为它们很简单,但其他的更复杂,并且有自己的属性。您认为它仍然可以这样工作吗?同样,在您的编辑中,对于
Color
仍然有2个子类型注释,对于
SpecialColor
仍然有2个子类型注释。这不行。您希望
Color
SpecialColor
的JSON外观如何?而
SpecialColor
本身是什么样子的呢?如果你想表达“如果
color
RED
YELLOW
,请使用
color
,如果它是
SPECIAL\u1
SPECIAL\u2
,请使用
SpecialColor
等。”那么我认为没有任何内置支持,您需要编写自己的
TypeResolverBuilder
并使用注释(注意:通常您所区分的属性不是对象本身的一部分,您可以使用类似
“type”的内容:“simple”
/
“special”
/
“custom”
来决定使用哪个类)红色或黄色的类应该看起来相同,但内部只有不同的信息。我刚才又查了一遍,似乎这个答案仍然有效