将 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);
我正在使用简单的 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);