Java地图<;字符串,对象>;投射到地图<;字符串,字符串>;不在运行时抛出错误 private静态字符串tmp=“{\'data\”:{\'vin\”:“LNBSCAK9JD065606\”,“extParameter\”:{\'systemTime\”:“2019-01-23 12:58:35\”,“fuelAmount\”:20.0},“pushType\”:“fuelWarn\”,“type\:“uaes物联网公共服务”; 公共静态void main(字符串[]args){ JSONObject JSONObject=JSON.parseObject(tmp); JSONObject data=JSON.parseObject(JSONObject.getString(“数据”); //第1行 Map result=(Map)data.getInnerMap().get(“extParameter”); 对于(Map.Entry项:result.entrySet()){ String key=item.getKey(); //第2行 字符串值=item.getValue(); } }
上面的代码抛出一个 第2行的ClassCastExecOption:java.math.BigDecimal无法强制转换为 java.lang.StringJava地图<;字符串,对象>;投射到地图<;字符串,字符串>;不在运行时抛出错误 private静态字符串tmp=“{\'data\”:{\'vin\”:“LNBSCAK9JD065606\”,“extParameter\”:{\'systemTime\”:“2019-01-23 12:58:35\”,“fuelAmount\”:20.0},“pushType\”:“fuelWarn\”,“type\:“uaes物联网公共服务”; 公共静态void main(字符串[]args){ JSONObject JSONObject=JSON.parseObject(tmp); JSONObject data=JSON.parseObject(JSONObject.getString(“数据”); //第1行 Map result=(Map)data.getInnerMap().get(“extParameter”); 对于(Map.Entry项:result.entrySet()){ String key=item.getKey(); //第2行 字符串值=item.getValue(); } },java,collections,classcastexception,Java,Collections,Classcastexception,上面的代码抛出一个 第2行的ClassCastExecOption:java.math.BigDecimal无法强制转换为 java.lang.String 但是结果类型实际上是Map[String,String],如果Map的值类型不是String,为什么在第1行抛出ClassCastExecption正在存储十进制值,因此系统正在尝试将您的十进制转换为您尝试转换的字符串,这样将抛出错误。结果类型仅为映射,因为您有一个不安全的转换。将会有一个编译器警告 泛型类型仅在编译时存在,在运行时映射不检
但是结果类型实际上是
Map[String,String]
,如果Map的值类型不是String,为什么在第1行抛出ClassCastExecption
正在存储十进制值,因此系统正在尝试将您的十进制转换为您尝试转换的字符串
,这样将抛出错误。结果类型仅为映射
,因为您有一个不安全的转换。将会有一个编译器警告
泛型类型仅在编译时存在,在运行时映射不检查其组件类型
String value=item.getValue()代码>
由于泛型类型的原因,编译器认为此映射只包含字符串
,因此您可以编写上述行。但它实际上编译成的是
private static String tmp = "{\"data\":{\"vin\":\"LNBSCCAK9JD065606\",\"extParameter\":{\"systemTime\":\"2019-01-23 12:58:35\",\"fuelAmount\":20.0},\"pushType\":\"fuelWarn\"},\"type\":\"uaes-iot-public-service\"}";
public static void main(String[] args) {
JSONObject jsonObject = JSON.parseObject(tmp);
JSONObject data = JSON.parseObject(jsonObject.getString("data"));
// line 1
Map<String, String> result = (Map<String, String>) data.getInnerMap().get("extParameter");
for (Map.Entry<String, String> item: result.entrySet()) {
String key = item.getKey();
// line 2
String value = item.getValue();
}
}
如果值恰好是其他值,则此操作将失败
“fuelAmount”:20.0
这不是JSON中的字符串。
您必须自己将其转换为字符串(或处理从映射返回的其他类型的值)
最好的解决方案可能是生成一些“bean”类,以便JSON解析器反序列化到其中。这些可以具有命名和类型化属性
String value = (String) item.getValue(); // cast inserted by compiler