xml - 使用 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)
提前非常感谢!
解决方案
我也为此苦苦挣扎了一段时间。这尤其令人困惑,这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
化,则必须为此模块添加另一个序列化器和/或反序列化器。
推荐阅读
- javascript - 如果这段代码在函数内部,为什么它不会运行?
- python - Python/SQLITE - OperationalError:没有这样的模块:RTREE
- django - 如何在 Django 表单中向时间字段添加选项?
- javascript - 使用 JQuery 动态更改 CSS 类后更新显示的文本元素
- java - android:获取孩子的孩子
- python - 程序退出后没有换行符的 Python 2.6 打印
- if-statement - 如何编写包含三个或更多组件的测试语句
- python-3.x - 导入时在 py 文件中运行函数
- python - 多处理解析数据到 sqlite 时出错
- python - Python:如何删除 Nx3 numpy 数组中的重复项