ClassCastException for downcast JSONObject to JSONArray



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

线程" main" 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的尝试始终丢弃铸造错误。Parsejson使用Intellij的调试器成功解析了JSON并返回多个键。

第一个JSON文件是这样的:

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

第二个JSON文件是这样的:

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

我的假设是由于键内有一个键或类似的东西吗?不确定为什么这告诉我我不能将其施加给数组,当我使用另一个Jonobject进行时。

您正在从对象到数组降低。如果实例确实是一个数组,则可以工作,如果不是数组,则会失败(例如地图)。通常,您应该始终使用Instance Off进行检查,例如:

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);

最新更新