簡體   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