[英]Cast JSONArray item to JSONObject - 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.