杰克逊unmarshal:将内部xml存储为字符串

时间:2017-04-05 12:56:34

标签: java xml jackson unmarshalling

我的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保持为String ??

3 个答案:

答案 0 :(得分:1)

我可以看到两个选项。

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

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

答案 1 :(得分:0)

我得到了它...我找到了一个名为Conversion Box的库来将HashMap转换为XML。

答案 2 :(得分:0)

我创建了自定义反序列化程序,用于将内部XML存储为String(例如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>"字符串。