You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSONObject获取值时整数转Double引发异常问题求助

解决JSON数值类型自动转换导致的类型转换异常问题

我帮你分析过这个问题了,这其实是JSON解析里一个挺常见的“坑”:像org.json这类常用的解析库,会根据JSON里数值的实际形式自动选择存储类型——如果数值没有小数部分(哪怕你写的是0.00,服务器返回时可能被优化成0),就会被解析成Integer而非Double,而当你试图把这个Integer直接赋值给Double变量,或者用getDouble()方法获取时,自然就会抛出类型转换异常。

下面给你几个实用的解决办法:

  • 优先用optDouble()方法安全取值
    JSONObject提供的optDouble()方法专门处理这种类型不统一的情况,它会自动把存储的Integer转成Double返回,还能指定默认值避免空指针问题:

    double precioCompra = jsonObject.optDouble("precioCompra", 0.0);
    

    这是最简单高效的解决方案,推荐优先使用。

  • 手动判断类型再转换
    如果你因为某些原因必须用get()方法,可以先判断返回值的类型,再手动转换:

    Object value = jsonObject.get("precioCompra");
    double precioCompra;
    if (value instanceof Integer) {
        precioCompra = ((Integer) value).doubleValue();
    } else if (value instanceof Double) {
        precioCompra = (Double) value;
    } else {
        // 这里可以根据业务需求处理非数值的情况,比如设默认值或者抛出异常
        precioCompra = 0.0;
    }
    
  • 调整解析库配置(如果用Jackson/Gson)
    要是你用的是Jackson或Gson这类功能更强大的解析库,可以直接配置强制将所有数值解析成Double:
    比如Jackson的配置方式:

    ObjectMapper mapper = new ObjectMapper();
    // 注册自定义反序列化器,把所有数值转成Double
    mapper.registerModule(new SimpleModule()
            .addDeserializer(Double.class, new JsonDeserializer<Double>() {
                @Override
                public Double deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
                    JsonNode node = p.getCodec().readTree(p);
                    return node.asDouble();
                }
            }));
    

    Gson的话可以自定义TypeAdapter:

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(Double.class, new TypeAdapter<Double>() {
                @Override
                public void write(JsonWriter out, Double value) throws IOException {
                    out.value(value);
                }
    
                @Override
                public Double read(JsonReader in) throws IOException {
                    if (in.peek() == JsonToken.NUMBER) {
                        return in.nextDouble();
                    }
                    throw new JsonSyntaxException("预期是数值类型,但实际是" + in.peek());
                }
            })
            .create();
    

本质上,JSON规范里的数值是不区分整数和浮点数的,不同解析库的处理逻辑有差异,这类轻量库会自动选择更节省空间的类型存储,才导致了这种类型不一致的问题,上面的方案核心都是统一数值类型的转换逻辑,帮你避开这个坑。

内容的提问来源于stack exchange,提问作者Fabián Romo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:22:45