繁体   English   中英

尝试解析JSONArray时发生ClassCastException

[英]ClassCastException when trying to parse a JSONArray

尝试使用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.lang.ClassCastException: org.json.simple.JSONArray cannot be cast 
    to org.json.simple.JSONArray

请注意,完全限定的类名看起来相同。 如果该消息是准确的转录,名称相同的1,这意味着你有两个版本JSONArray加载到JVM类!

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

事实是,类的运行时类型由类FQN和类加载器标识。 即使字节码相同,在不同的类加载器中加载的具有相同FQN的两个类也属于不同类型。 这意味着它们与分配不兼容,并且会导致奇怪的(但正确的!)类强制转换失败。

解:

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

1-一个真正晦涩的替代解释是,由于“象形文字”,这些名称看起来相同,但实际上却不同。 但是在这种情况下,我认为我们可以不合理地解释这种解释。

应该像

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM