首页 > 解决方案 > 使用 Jackson XMLMapper 本地化 Float / Double

问题描述

我目前正在寻找一种方法来本地化浮点/小数的小数分隔符,当它使用来自 com.fasterxml.jackson.dataformat.xml 的 XMLMapper 序列化为 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)

提前非常感谢!

标签: xmlkotlinjacksonjackson-databind

解决方案


我也为此苦苦挣扎了一段时间。这尤其令人困惑,这ObjectMapper::setLocaleXmlMapper.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化,则必须为此模块添加另一个序列化器和/或反序列化器。


推荐阅读