当我尝试获取键“key2”的值时,它将抛出异常,说“线程中的异常”主“java.lang.ClassCastException:java.lang.Integer无法强制转换为java.lang.String”
有解释这个问题的好方法吗?这是否意味着即使我有一个(String,String)映射,其中的值也不是必需的String?
为任何混淆道歉。如果有什么不清楚,请告诉我。
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", 99);
map.put("key3", new Date());
JsonUtil jsonUtil = new JsonUtil();
String s = jsonUtil.toJson(map);
HashMap<String, String> newMap = jsonUtil.fromJson(s, HashMap.class);
String value = newMap.get("key2");
答案 0 :(得分:1)
在map中,键“key2”的值为99,这是一个整数。可能在第二行到最后一行抛出异常,而不是最后一行。我不完全确定你为什么要序列化然后立即反序列化,但是如果你只想将99作为像“99”这样的字符串,那么这样做的方法是:
String value = String.valueOf(map.get("key2"));
在这种情况下,不需要序列化和反序列化。
更好的是,如果你一直想要Map<String, String>
,你可以这样做:
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", String.valueOf(99));
map.put(new Date().toString());
答案 1 :(得分:1)
当您致电fromJson(s, HashMap.class)
时,您并未向解码器提供任何通用类型信息 - 它看到的只是HashMap
,并且该调用的隐式返回类型为{{1 }}。 JSON可以假设字符串键,并且解码器正在尽力将对象解码为他们的&#34; native&#34;表示,所以当你告诉编译器所有的键和值都是字符串时,就会出现不匹配的情况。
如果您指定涉及哪个 HashMap<?,?>
,我们可能会提供更具体的方法;否则,您可以使用类似流转换的方法将每个值转换为JsonUtil
。
答案 2 :(得分:0)
String value = newMap.get("key2");
在此行中,您将在hashMap中获取key2
的值,然后将其分配给无效的String
类型变量value
。由于key2
的值为Integer类型,因此无法直接执行此操作。您可以将此值放在“整数类型变量”中。如下:
int value = newMap.get("key2");
或者,如果您想要一个通用解决方案,以便可以将任何类型的变量分配到value
,那么您可以将其声明为Object
类型。如下:
Object value = newMap.get("key2");