gpt4 book ai didi

java - jackson 将所有数字读取为 BigDecimal

转载 作者:行者123 更新时间:2023-12-05 07:42:32 24 4
gpt4 key购买 nike

我们使用 Jackson 从文件系统读取 json 并将其解析为 POJO。

POJO

String name;
Map<String,Object> map;
getters/setters

阅读

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
Pojo obj = mapper.readValue(jsonFile, Pojo.class);

问题

当我们在 json(映射部分)中有数字时,它们会被转换为 IntegerDouble。我们希望我们所有的数字(小数和整数)都为 Type BigDecimal 所以我尝试使用

mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

但这只适用于十进制数。没有可用于将整数转换为 BigDecimal 的功能。

问题

  1. 我们是否有任何内置功能可以让 ObjectMapper 将所有数字读取到 BigDecimal?
  2. 如果我需要编写自定义序列化程序,我需要为整个类编写还是可以为 Map 字段编写?

最佳答案

您可以使用包含自定义 JsonDeserializerObjectMapper 注册一个 Module。你不需要自己制作,因为 Jackson Databind 提供了一个 BigDecimalDeserializer但您还需要做一件事才能让它发挥作用。

因为BigDecimalDeserializer是用@JacksonStdImpl注解的,Jackson不允许你直接使用这个,因为初始化代码(我目前不同意)specifically checks for this annotation and disallows it .因为这个反序列化器不是 final,所以您可以通过创建匿名子类来解决这个问题,而无需复制粘贴。

最后会变成这个样子

Module module = new SimpleModule();
module.addDeserializer(Number.class, new NumberDeserializers.BigDecimalDeserializer() {});
new ObjectMapper().registerModule(module).readValue("{}", Map.class);

关于java - jackson 将所有数字读取为 BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com