将 JSONObject 向下转换为 JSONArray 的 ClassCastException

ClassCastException for downcast JSONObject to JSONArray

我正在使用简单的 JSON 库为 tf2 编写匹配日志分析器。该代码成功获取了所有日志 ID,但无法获取实际日志本身。错误是

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray

但是,在代码中,我已经将对象转换为数组。 这是代码片段,其中 parseJSON returns 一个 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 和 returns 多个键。

第一个 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": [ ...]

log是一个数组,而

"players" : { ... }

玩家是一张地图。

很明显,您提到的 JSONObject 是一种地图,因此您不能简单地将其转换为 JSONArray.For,您可以创建 JSONArray,然后继续。要将 JSONObject 创建为 JSONArray,您可以使用:

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