Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试解析JSONArray时的ClassCastException_Java_Json_Classcastexception - Fatal编程技术网

Java 尝试解析JSONArray时的ClassCastException

Java 尝试解析JSONArray时的ClassCastException,java,json,classcastexception,Java,Json,Classcastexception,尝试使用库解析以下JSON字符串时: 我得到一个例外: java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONArray 我就是这样做的: JSONArray json = (JSONArray) new JSONParser().parse(jsonString); JSON字符串是一个数组,因此不确定引发该异常的原因 这里有几个类似的问题,但在他们的例子中

尝试使用库解析以下JSON字符串时:

我得到一个例外:

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,但它没有打印“这是一个JSONArray”

它应该是这样的

    Object obj = new JSONParser().parse(jsonString);
    JSONArray json = new JSONArray();
json.add(obj);

你说你得到了这个:

java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast 
    to org.json.simple.JSONArray
请注意,完全限定的类名看起来完全相同。如果该消息被准确地转录,并且名称相同,这意味着您的JVM中加载了两个版本的
JSONArray

这在JVM中是可能的,在JVM中,应用程序或框架有多个类加载器,并且您已设法在多个类加载器中加载该类。例如,如果您在web容器的共享库目录和webapp的WAR文件中都有JSON库JAR文件,则可能会发生这种情况

问题是类的运行时类型由类FQN和类加载器标识。在不同的类加载器中加载的具有相同FQN的两个类是不同的类型,即使字节码相同。这意味着它们不兼容赋值,这会导致奇怪的(但正确的!)类转换失败

解决方案:

  • 查看执行平台上的web容器文件树,找到JSON JAR文件的多个副本
  • 从共享库目录或所有WAR文件中删除有问题的副本


  • 1-另一种非常模糊的解释是,由于“同形文字”,名称看起来相同,但实际上不同。但在这种情况下,我认为我们可以认为这种解释是不可信的。

    可能重复的请解释否决票,标记为重复的问题是不同的,我的问题是针对一种奇怪的情况提出的,在这种情况下,显然无法将JSON数组强制转换为JSONArray对象将其解析为
    JSONObject
    ,然后使用
    instanceof
    @cj1检查它是否为
    JSONArray
    。请查看我的编辑此错误在尝试解析时没有发生。解析成功。转换不正确。结果相同,它在第二行中引发异常。如果您确定输入与您提供的完全相同,请检查编辑的答案。如果它有效,请upvoteI我想可能就是这样,看起来应用程序中还有其他地方加载了库jar,我将调查此路径并更新问题是的,这解决了问题,库加载在两个不同的地方,所以我只是删除了其中一个jar,以确认我还打印了
    json.getClass().getClassLoader()
    它们是不同的,谢谢!
    java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast 
        to org.json.simple.JSONArray