2017-12-01 14 views
0

나는 간단한 JSON 라이브러리를 사용하여 tf2에 대한 일치 로그 분석기를 작성하고 있습니다. 코드는 모든 로그 ID를 성공적으로 가져 오지만 실제 로그 자체에는 도달 할 수 없습니다. org.json.simple.JSONObject가에,다운 캐스팅 JSONObject 대 JSONArray에 대한 ClassCastException

그러나 org.json.simple.JSONArray으로 캐스팅 할 수 없습니다 오류는 스레드

예외는 "주요"java.lang.ClassCastException가이 있다는 것입니다 코드, 이미 배열에 객체를 캐스팅했습니다. 여기 parseJSON가 된 JSONObject를 반환 코드의 조각과 logIDList 모든 로그 ID의 목록이 포함되어 다음 된 JSONObject는 항상 캐스팅 오류가 발생 캐스팅에서

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

두 번째 시도. 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

개체가 배열로 다운 캐스팅되었습니다. 이것은 인스턴스가 실제로 배열 인 경우 작동하고, 그렇지 않은 경우 (맵과 같이) 실패합니다. 당신은 당신이 게시 된 JSON에서 볼 수 있듯이

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

: 당신은 언제나처럼, 일반적으로 instanceof를 검사로 다운 캐스트를 보호해야

"logs": [ ...] 

로그가 배열 인,

"players" : { ... } 

동안 플레이어는지도입니다.

+0

는 설명 주셔서 너무 감사합니다! 나중에 참조 할 수 있도록 instanceof를 염두에 두겠습니다. – MrSoupman

0

당신이 계시 한 JSONObject가 일종의 맵이기 때문에 JSONArray로 간단하게 캐스팅 할 수 없습니다.이 경우 JSONArray를 생성하고 진행할 수 있습니다. 당신이 사용할 수있는 JSONArray로 된 JSONObject를 만들려면 :

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