前段返回属性是 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替换为你要序列化的实际变量即可。解决 无用评论 打赏 举报 编辑记录