Jackson unmarshal:将内部 xml 存储为字符串

Jackson unmarshal: store inner xml as string

我的XML:

<body>
   <type>authorizationStatus</type>
   <data>
      <AuthorizationStatusMessage>
         <id>12345679</id>
         <email>abc</email>
      </AuthorizationStatusMessage>
   </data>
</body>

我想将此 XML 解组为这样的 POJO:

public class XMPPMessage {
    private String type;
    private String data;
}

Jackson unmarshal 给我一个 HashMap:

{AuthorizationStatusMessage={id_colaborador=12345679, email=rhochman@atech.com}}

但我想将数据 XML 保留为这样的字符串:

<AuthorizationStatusMessage><id>12345679</id><email>abc</email></AuthorizationStatusMessage>

如何将内部 XML 保留为字符串?

我可以看到两个选项。

  1. 如果您可以修改 XML 架构,您可能希望利用 CDATA 部分 (https://en.wikipedia.org/wiki/CDATA) 将 <data> 内容保留为String.

  2. 您可以实现自定义 Jackson 反序列化器以仅提取 typedata。网络上有很多很好的参考资料(例如 http://www.baeldung.com/jackson-deserialization)。

我不知何故...我找到了一个名为 Conversion Box 的库,用于将 HashMap 转换为 XML。

我创建自定义反序列化器以将内部 XML 存储为字符串,Kotlin 上的示例:

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer
import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.dataformat.xml.XmlMapper


object XmlInnerDeserializer : StdScalarDeserializer<String>(String::class.java) {
    override fun deserialize(jp: JsonParser?, context: DeserializationContext?): String {
        val node = jp!!.codec.readTree<ObjectNode>(jp)
        val xmlMapper: ObjectMapper = XmlMapper()
        val xml = xmlMapper.writeValueAsString(node)
        return xml.toString()
    }
}

如何使用:

@JacksonXmlRootElement(localName = "body")
@JsonIgnoreProperties(ignoreUnknown = true)
class XMPPMessage (
    @JsonDeserialize(using = XmlInnerDeserializer::class)
    @JacksonXmlProperty(localName = "data")
    val data: String
}

字段 data 包含 "<ObjectNode><AuthorizationStatusMessage>... </AuthorizationStatusMessage></ObjectNode>" 字符串。