簡體   English   中英

用於將JSONObject轉換為JSONArray的ClassCastException

[英]ClassCastException for downcast JSONObject to JSONArray

我正在使用簡單的JSON庫為tf2編寫匹配日志分析器。 該代碼成功獲取了所有日志ID,但無法獲取實際的日志本身。 錯誤是

線程“主”中的異常java.lang.ClassCastException:org.json.simple.JSONObject無法轉換為org.json.simple.JSONArray

但是,在代碼中,我已經將一個對象強制轉換為數組。 以下是代碼片段,其中parseJSON返回JSONObject,而logIDList包含所有日志ID的列表:

JSONArray playerData = (JSONArray)parseJSON("http://logs.tf/json_search?player=" + steamID64).get("logs");
    //....
        JSONArray tempJSONArray = (JSONArray)parseJSON("http://logs.tf/json/" + logIDList.get(j)).get("players");

強制轉換JSONObject的第二次嘗試始終會引發強制轉換錯誤。 使用IntelliJ的調試器,parseJSON成功解析JSON並返回多個鍵。

第一個JSON文件的結構如下:

{
 "logs": [
{
  "date": 1512093930, 
  "id": 1893064, 
  "title": "UGC 6v6 Match: RED vs -rep"
},
],
} 

第二個JSON文件的結構如下:

{  
"players" : {
"[U:1:61383870]":{(Player Stats)}
},
}

我的假設是,這是由於某個鍵中存在某個鍵之類的? 不知道為什么當我使用另一個JSONObject執行此操作時,為什么不能將其轉換為數組。

您正在從對象下放到數組。 如果實例確實是數組,則此方法有效,否則,則失敗(如映射)。 一般而言,您應該始終使用instanceof檢查來保護向下轉換,例如:

JSONArray playerData;
JSONObject playerJson = parseJSON("http://logs.tf/json_search?player=" + steamID64).get("logs");
if (playerJson instanceof JSONArray) {
    playerData = (JSONArray) playerJson;
} else {
    throw new IllegalStateException("wrong Json type " + playerJson)
}

從發布的json中可以看到:

"logs": [ ...]

日志是一個數組,而

"players" : { ... }

玩家是一張地圖。

顯而易見,您提到的JSONObject是一種映射,因此您不能簡單地將其強制轉換為JSONArray。為此,您可以創建JSONArray然后繼續進行操作。 要將JSONObject創建為JSONArray,可以使用:

 JSONArray JSONFirewallRules = jsonObject.getJSONArray(jsonStrings.REQUEST_RULES_ALL_RESPONSE); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM