Java使用org.json库时数值类型不一致 如何统一读写均使用double类型
org.json 统一数值读写为double的实现方案
问题根因
从org.json 20230205版本开始,库默认开启两项会影响数值处理的核心逻辑:
- 解析JSON数值时默认转成BigDecimal实例,替代旧版本的Integer/Long/Double类型
- 写入double类型值时,自动将无小数位的数值简化为整数格式(比如15.0序列化为15)
这两项逻辑是你遇到读取类型不统一、自动转整数问题的核心原因,不需要更换JSON库,通过内置配置即可完全适配统一为double的需求。
读取端配置(彻底消除BigDecimal类型返回)
读取JSON流时,手动调整解析配置,关闭BigDecimal自动转换:
// 替换默认的JSON读取逻辑 InputStream input = new FileInputStream("target.json"); JSONTokener tokener = new JSONTokener(input); // 自定义解析配置 tokener.setParserConfiguration( new JSONParserConfiguration.Builder() .setUseBigDecimalForNumbers(false) .build() ); JSONObject root = new JSONObject(tokener); JSONArray objects = root.getJSONArray("objects");
配置生效后,不管JSON里的数值是整数格式还是小数格式,直接调用内置的getDouble(key)方法取值即可,不需要做类型判断,也不会拿到BigDecimal实例。
写入端配置(强制保留double格式,不自动转整数)
不要直接使用原生的put(key, doubleValue)方法写入数值——org.json内部会自动判断如果double值小数位为0,就简化为整数格式写入JSON。
统一用自定义方法封装double写入逻辑,强制保留小数格式:
/** * 强制以double格式写入JSON值,不触发自动整数简化 */ private void putDoubleValue(JSONObject target, String key, double value) { target.put(key, new JSONDouble(value)); }
JSONDouble是org.json内置的专用数值类型,序列化时会强制保留double原生格式,不会做整数简化。如果使用的org.json版本较低没有内置这个类,可以手动实现序列化包装:判断写入的double值小数位为0时,输出字符串格式的{value}.0,写入后序列化为JSON即可保证格式统一。
冗余方案说明
你之前尝试的类型判断、手动调用doubleValue()转换的方案,本质是没有从配置层关闭库的默认行为,全靠业务代码做兜底,自然会产生大量重复判断逻辑。调整配置后,全链路读写的类型会完全统一为double,不需要额外的转换代码。
内容的提问来源于stack exchange,提问作者user14938030
相关产品推荐
相关产品推荐

