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 保留为字符串?
我可以看到两个选项。
如果您可以修改 XML 架构,您可能希望利用 CDATA
部分 (https://en.wikipedia.org/wiki/CDATA) 将 <data>
内容保留为String
.
您可以实现自定义 Jackson 反序列化器以仅提取 type
和 data
。网络上有很多很好的参考资料(例如 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>"
字符串。
我的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 保留为字符串?
我可以看到两个选项。
如果您可以修改 XML 架构,您可能希望利用
CDATA
部分 (https://en.wikipedia.org/wiki/CDATA) 将<data>
内容保留为String
.您可以实现自定义 Jackson 反序列化器以仅提取
type
和data
。网络上有很多很好的参考资料(例如 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>"
字符串。