你如何声明一个使用Jackson XML的JsonTypeInfo.As.WRAPPER_OBJECT的多态字段?
我在一个用Kotlin编写的Android应用程序中接收XML消息,我试图弄清楚如何在不是根节点时使用Jackson的多态反序列化。
这是一个简单的例子。 假设我收到两种类型的消息(“数据”消息和“文本”消息):
<MSG> <TT> <id>3</id> <text>hi</text> </TT> </MSG> <MSG> <DT> <id>4</id> <data>93328afd0</data> </DT> </MSG>
消息由它们的包装元素来区分,所以我设置了一些sealed class
声明:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) @JsonSubTypes( JsonSubTypes.Type(name = "TT", value = MT.TT::class), JsonSubTypes.Type(name = "DT", value = MT.DT::class)) sealed class MT { data class TT( val id: Int, val text: String ) : MT() data class DT( val id: Int, val data: ByteArray ) : MT() } data class MSG( // @JsonProperty("MSG") // @JsonUnwrapped // @JacksonXmlText val type: MT )
还有一个测试:
@Test fun testJson() { val ser = XmlMapper().registerModule(KotlinModule()) println(ser.writerWithDefaultPrettyPrinter().writeValueAsString(MSG(MT.TT(3, "hi")))) println(ser.writerWithDefaultPrettyPrinter().writeValueAsString(MSG(MT.DT(3, byteArrayOf(0, 0, 1))))) val m = ser.readValue(""" |<MSG> | <TT> | <id>3</id> | <text>hi</text> | </TT> |</MSG> """.trimMargin(), MSG::class.java) println(m) }
但是输出如下所示:
<MSG> <type> <TT> <id>3</id> <text>hi</text> </TT> </type> </MSG>
由于多态字段不是根,所以我创建了一个MSG
根类,但是我不确定它的字段名称是什么,因为XML中的元素名称发生了变化。
我尝试使用@JsonUnwrapped
,但与JsonTypeInfo
使用时会引发异常。
我也尝试@JacksonXmlText
但不知何故被应用于<id>
而不是<type>
。