我使用简单的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执行此操作时,我无法将其转换为数组。
答案 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);