使用Gson解析器未定义Double变量却报Invalid Double异常
解决Gson解析空字符串触发Invalid Double异常的问题
这种情况我之前踩过坑!虽然你的类里没定义Double类型,但大概率是JSON里某个**数值类型字段(比如int、float、long)**返回了空字符串""——Gson底层解析逻辑里,会尝试把这类异常值转成Double处理,结果就抛出了这个看似矛盾的异常。
给你几个实用的解决方向:
自定义通用TypeAdapter处理空字符串
写一个适配所有数值类型的TypeAdapter,遇到空字符串就返回默认值或null,从根源上拦截解析错误。示例代码如下:public class NumberTypeAdapter extends TypeAdapter<Number> { @Override public void write(JsonWriter out, Number value) throws IOException { if (value == null) { out.nullValue(); return; } out.value(value); } @Override public Number read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } String stringValue = in.nextString(); if (stringValue.isEmpty()) { // 这里可以返回0、null或者你需要的默认值 return 0; } try { return Double.parseDouble(stringValue); } catch (NumberFormatException e) { // 额外处理格式错误的情况 return null; } } }然后创建Gson实例时注册这个适配器:
Gson gson = new GsonBuilder() .registerTypeAdapter(Integer.class, new NumberTypeAdapter()) .registerTypeAdapter(Float.class, new NumberTypeAdapter()) .registerTypeAdapter(Long.class, new NumberTypeAdapter()) .create();临时开启宽松解析模式
如果只是想快速验证问题,可以开启Gson的宽松解析,它会忽略部分格式异常:Gson gson = new GsonBuilder() .setLenient() .create();不过这个方法不推荐长期使用,容易掩盖其他潜在的JSON格式问题。
精准定位出错字段
先打印触发异常的完整JSON字符串,找到那个空字符串对应的字段,然后针对性处理:比如给该字段单独设置TypeAdapter,或者临时把字段类型改成String测试,确认问题后再调整回合适的数值类型并做兼容处理。
内容的提问来源于stack exchange,提问作者Siddhesh Pawar
相关产品推荐
相关产品推荐

