Json 在使用jackson子类型时,如何避免获得包含随机信息的额外字段?
我试图使用JSON子类型为不同事件创建某种“通用”对象收件人 目前我有这样的想法: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
@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”
来决定使用哪个类)红色或黄色的类应该看起来相同,但内部只有不同的信息。我刚才又查了一遍,似乎这个答案仍然有效