尝试解析JSONArray时出现ClassCastException

问题描述 投票:2回答:2

尝试使用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,因此抛出异常是有道理的,但在这种情况下,它看起来是正确的。

----------------- ----------------- EDITS

我添加了一行来打印对象的类,如下所示:

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"

java json classcastexception
2个回答
6
投票

你说你得到了这个:

java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast 
    to org.json.simple.JSONArray

请注意,完全限定的类名称看起来完全相同。如果该消息被准确转录,并且名称相同1,则意味着您将两个版本的JSONArray类加载到您的JVM中!

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

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

解:

  1. 查看执行平台上的Web容器文件树,以查找JSON JAR文件的多个副本。
  2. 从共享lib目录或所有WAR文件中删除有问题的副本。

1 - 一个非常模糊的替代解释是由于“同形体”而名称看起来相同,但实际上是不同的。但在这种情况下,我认为我们可以将这种解释视为难以置信。


-2
投票

应该是这样的

    Object obj = new JSONParser().parse(jsonString);
    JSONArray json = new JSONArray();
json.add(obj);
© www.soinside.com 2019 - 2024. All rights reserved.