ycgyab 2024-04-02 18:00 采纳率: 0%
浏览 17
已结题

Map json序列化问题

前段返回属性是 List<Map<String, Object>> 其中Map的vaue值里面包含一个Bigdecimal类型,序列化后,后面小数点没有,看有号的解决方案不

  • 写回答

26条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-02 18:00
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    在Java中处理JSON序列化时,对于BigDecimal类型的精度丢失问题,通常是由于默认的JSON库(例如Jackson或Gson)在序列化过程中对数字格式的默认处理方式导致的。为了解决这个问题,你需要对BigDecimal进行特殊配置,确保其在转换为JSON字符串时保留足够的小数位。

    如果你使用的是Jackson库,可以通过ObjectMapper设置全局配置:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    // 创建并配置ObjectMapper实例
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); // 使其以原始形式输出BigDecimal
    
    // 序列化List<Map<String, Object>>
    String json = objectMapper.writeValueAsString(yourListOfMaps);
    

    这段代码将使Jackson在序列化时保持BigDecimal的原始精度,不会省略小数点后的部分。

    若使用Gson库,则可能需要自定义一个TypeAdapter:

    import com.google.gson.GsonBuilder;
    import com.google.gson.TypeAdapter;
    import com.google.gson.stream.JsonReader;
    import com.google.gson.stream.JsonWriter;
    
    import java.io.IOException;
    import java.math.BigDecimal;
    
    public class BigDecimalAdapter extends TypeAdapter<BigDecimal> {
        @Override
        public void write(JsonWriter out, BigDecimal value) throws IOException {
            if (value != null) {
                out.value(value.toPlainString()); // 使用toPlainString方法保留所有精度
            } else {
                out.nullValue();
            }
        }
    
        @Override
        public BigDecimal read(JsonReader in) throws IOException {
            return in.nextString() == null ? null : new BigDecimal(in.nextString());
        }
    
        // 配置Gson使用这个TypeAdapter
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(BigDecimal.class, new BigDecimalAdapter())
            .create();
    
        // 序列化List<Map<String, Object>>
        String json = gson.toJson(yourListOfMaps);
    }
    

    以上代码展示了如何分别在Jackson和Gson库中处理BigDecimal类型的序列化问题,以防止小数点后的精度丢失。只需将yourListOfMaps替换为你要序列化的实际变量即可。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 关于移动机器人坐标计算
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法