前段返回属性是 List<Map<String, Object>> 其中Map的vaue值里面包含一个Bigdecimal类型,序列化后,后面小数点没有,看有号的解决方案不
26条回答 默认 最新
关注 获得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
替换为你要序列化的实际变量即可。解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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编写领子和褶裥的模型的方法