我目前正在寻找一种方法,以便在使用XMLMapper从com.fasterxml.jackson.dataformat.xml序列化为XML时,对浮点/十进制分隔符进行本地化。
我面临的问题是:当XMLMapper序列化一个浮点数/十进制时,它现在使用的是默认的“。作为小数分隔符,即"2.00“。
但是,我希望浮点数/双面有一个",“作为分隔符,即"2,00”。
我到处找遍了,但还是没有找到解决办法。
是否有一种使用XMLMapper的优雅方法来做到这一点?还是杰克逊没有这样的功能?
映射器的当前配置是:
val xmlMapper = XmlMapper()
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT)
xmlMapper.propertyNamingStrategy = CustomPropertyNamingStrategy()
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true)
xmlMapper.setDefaultUseWrapper(false)提前谢谢你!
发布于 2021-12-07 19:19:55
我也为此挣扎了一段时间。尤其令人困惑的是,ObjectMapper::setLocale和XmlMapper.Builder::defaultLocale并没有提供任何帮助。
最后,我决定编写一个自定义序列化程序/反序列化程序对:
val doubleModule = SimpleModule("CommaDoubleDeserialization", Version.unknownVersion())
// note: this is the com.fasterxml.jackson.module.kotlin.addSerializer extension function
// it registers the primitive type AND the wrapper class
.addSerializer(Double::class, object : JsonSerializer<Double>() {
override fun serialize(value: Double, generator: JsonGenerator, provider: SerializerProvider) {
generator.writeRawValue(value.toString().replace('.', ','))
}
})
.addDeserializer(Double::class, object : JsonDeserializer<Double>() {
override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): Double? {
return parser.valueAsString.trim().replace(',', '.').toDoubleOrNull()
}
})
return XmlMapper.xmlBuilder()
.defaultUseWrapper(false)
.addModules(doubleModule, kotlinModule())
.build()这不是我所期望的优雅的解决方案,但它完成了工作。如果您也需要反序列化到Float,则必须向模块中添加另一个序列化程序和/或反序列化器。
https://stackoverflow.com/questions/69917526
复制相似问题