gpt4 book ai didi

Java Map 转换为 Map 在运行时不会抛出错误

转载 作者:行者123 更新时间:2023-11-30 01:56:30 33 4
gpt4 key购买 nike

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();
}
}

上面的代码抛出一个

ClassCastExecption at line 2: java.math.BigDecimal cannot be cast to java.lang.String

但结果类型实际上是 Map[String, String] ,如果 map 的值类型不是 String,为什么在第 1 行会抛出 ClassCastExecption

最佳答案

结果类型仅为 Map<String, String>,因为您有一个不安全的强制转换,导致其如此。将会有一个关于此的编译器警告。

泛型类型仅在编译时存在,在运行时Map不会检查其组件类型。

String value = item.getValue();

由于泛型类型,编译器认为这个 Map 只包含 String ,所以你可以写上面的行。但它实际编译的结果是

String value = (String) item.getValue(); // cast inserted by compiler

如果该值碰巧是其他值,则会失败。

"fuelAmount":20.0

这不是 JSON 中的字符串。您必须自己将其转换为字符串(或处理从 Map 返回的其他类型的值)。

最好的解决方案可能是为 JSON 解析器创建一些“bean”类来反序列化。这些可以具有命名和类型属性。

关于Java Map<String,Object> 转换为 Map<String,String> 在运行时不会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321907/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com