当尝试使用json.simple库解析以下JSON字符串时:
[
{"id" : "6d7662a9.f8ba04"},
{"id" : "2da98cc2.145ba4"},
{"id" : "45492640.a17d68"}
]
我收到此异常:
java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONArray
这就是我的做法:
JSONArray json = (JSONArray) new JSONParser().parse(jsonString);
JSON字符串是一个数组,因此不确定为什么会引发该异常。
这里有几个类似的问题,但是在他们的情况下,他们试图将JSONObject
强制转换为JSONArray
,因此抛出异常是有意义的,但在这种情况下,它看起来是正确的。
-----------------编辑-----------------
我添加了一行以打印对象的类,如下所示:
Object json = new JSONParser().parse(jsonString);
System.out.println(json.getClass());
打印以下行:
class org.json.simple.JSONArray
在下一行中,如果有:
if(json instanceof JSONArray) {
System.out.println("This is a JSONArray");
}
但是它不能访问if,所以它真的很奇怪,因为首先我检查对象是JSONArray,但是它不打印"This is a JSONArray"
答案 0 :(得分:6)
您说您正在得到这个:
java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast
to org.json.simple.JSONArray
请注意,完全限定的类名看起来相同。如果该消息被正确转录,并且名称 相同 1 ,则意味着您已将两个JSONArray
类的版本加载到JVM中!
这在JVM中是可能的,在JVM中,应用程序或框架具有多个类加载器,并且您已设法在多个类加载器中加载该类。例如,如果您在Web容器的共享库目录中同时在Webapp的WAR文件中同时拥有JSON库JAR文件,则可能会发生这种情况。
问题是,类的运行时类型由类FQN和类加载器标识。即使字节码相同,在不同的类加载器中加载的具有相同FQN的两个类也属于不同类型。这意味着它们与分配不兼容,并且会导致奇怪的(但正确的!)类强制转换失败。
解决方案:
1-一个真正晦涩的替代解释是,由于“象形文字”,这些名称看起来相同,但实际上却不同。但在这种情况下,我认为我们可以不合理地解释该解释。
答案 1 :(得分:-2)
应该像
Object obj = new JSONParser().parse(jsonString);
JSONArray json = new JSONArray();
json.add(obj);