向下转换JSONObject到JSONArray

时间:2017-12-01 04:55:00

标签: java json classcastexception downcast

我使用简单的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总是会抛出一个转换错误。使用IntelliJ的调试器,parseJSON成功解析JSON并返回多个键。

第一个JSON文件的结构如下:

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

第二个JSON文件的结构如下:

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

我的假设是,这是因为密钥中有密钥或类似的东西?不知道为什么这会告诉我,当我用另一个JSONObject执行此操作时,我无法将其转换为数组。

2 个答案:

答案 0 :(得分:0)

您正在从Object转换为Array。如果实例确实是一个数组,则该方法有效,如果不是(如地图),则会失败。您应该始终使用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" : { ... }
玩家是一张地图。

答案 1 :(得分:0)

由于可以清楚地看到你所提到的JSONObject是一种地图,所以你不能简单地将它转换为JSONArray。为此你可以创建你的JSONArray然后继续。要将JSONObject创建为JSONArray,您可以使用:

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