DecimalFormat格式化double后存入HashMap转JSON时变为字符串的问题
解决Double类型转JSON时0.0/0.00显示为数字0的问题
哥们,我太懂你踩的这个坑了——用DecimalFormat格式化后存进HashMap,转JSON就变成字符串,明明直接打印是数字,序列化就变了样。核心问题其实很简单:你存进HashMap的是字符串类型,Gson自然会按字符串规则序列化它。下面给你两个靠谱的解决思路:
思路一:存入HashMap前提前处理值
既然要输出数字类型,那就在把数据放进HashMap的时候,先判断是否为0.0,是的话直接存整数0(或者Double类型的0都行),非0值就存原Double数据。这样Gson序列化时识别的是数字类型,输出自然是数字:
// 假设你的动态Double数据是这个变量 Double dynamicData = ...; HashMap<String, Object> dataMap = new HashMap<>(); // 判断是否为0.0(如果是计算得到的近似0,建议用Math.abs(dynamicData) < 1e-9来判断,避免精度问题) if (dynamicData != null && dynamicData.compareTo(0.0) == 0) { dataMap.put("your_key", 0); // 存Integer类型的0,Gson会转成数字0 } else { dataMap.put("your_key", dynamicData); // 非0值存原Double } // 用Gson序列化 Gson gson = new Gson(); String json = gson.toJson(dataMap);
思路二:用Gson自定义序列化器(更优雅)
如果不想每次存数据都手动判断,可以让Gson在序列化Double类型时自动处理——自定义一个TypeAdapter,让它遇到0.0时输出整数0,其他情况正常输出数字:
// 构建自定义Gson实例 Gson customGson = new GsonBuilder() .registerTypeAdapter(Double.class, new TypeAdapter<Double>() { @Override public void write(JsonWriter out, Double value) throws IOException { if (value != null) { // 处理近似0的情况,避免计算精度导致的误判 if (Math.abs(value) < 1e-9) { out.value(0); // 写入整数0 } else { out.value(value); // 正常写入Double值 } } else { out.nullValue(); // 处理null的情况 } } @Override public Double read(JsonReader in) throws IOException { // 反序列化逻辑,不需要特殊处理的话直接返回Double即可 return in.nextDouble(); } }) .create(); // 直接序列化你的HashMap就行 String json = customGson.toJson(dataMap);
这样不管你HashMap里存的是0.0还是其他Double值,Gson都会帮你把0.0转成数字0,全程不用手动修改存入的数据,省心又优雅。
内容的提问来源于stack exchange,提问作者Srikar
相关产品推荐
相关产品推荐

