반응형

[이클립스/Eclipse] org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject 문제 해결 방법은 Restful API를 호출하여 가져오는 데이터의 형태에 따라 Casting을 어떻게 하냐에 따라 다르다. 진짜.. 이것 때문에 삽질 오지게 했다. 이 문제에서는 org.json 패키지냐 org.json.simple 패키지냐를 잘 봐야 한다.

 

해결방법

내가 이 문제를 겪었던 원인은 패키지에서 org.json.simple이냐 org.json이냐에 따라 문제가 발생했다.

List<org.json.simple.JSONObject> res = new ArrayList<>();
res = restApiService.getLabel(map); // List<JSONObject>형으로 리턴

org.json.simple.JSONObject sRow = res.get(j);

 

Restful API를 호출하여 결과를 받은 데이터는 String형으로 왔다.

String listData = postRequest.excutePost(systemConfig.getUrl() + "/api/label/list.rest", jsonString);

 

이 String형의 데이터는 {"data" : [{"ID" : "1"}, {"ID" : "1"}, {"ID" : "1"}] 이런 식으로 감싸져 있었다.

 

그래서, 아래와 같이 String형의 JSon Data를 파싱했다.

Object obj = null;
JSONObject jsonObj = null;
JSONParser jsonParser = new JSONParser();

obj = jsonParser.parse(str);
jsonObj = (JSONObject) obj;

 

String형의 데이터를 JSONParser를 통해 Object로 바꾸고, 이 Object를 다시 JSONObject로 캐스팅을 합니다.

 

그런 다음에, data로 Key를 가지는 Value를 꺼내야 하므로, 아래와 같이 Value를 추출합니다.

Object jo = jsonRt.get("data");

 

그러면, [{"ID" : "1", "NAME" : "TEST"}, {"ID" : "2", "NAME" : "TEST"}, {"ID" : "3", "NAME" : "TEST"}] 이렇게 생긴 데이터가 JSONArray 형태로 감싸져 있기 때문에, Object를 JSONArray 형태로 바꾼 다음에, 안에 들어 있는 Object 데이터를 JSONObject로 캐스팅하여 꺼내줍니다.

JSONArray temp = (JSONArray) jo;
						
for(int i = 0; i < temp.size(); i++) {
	JSONObject jsonObj = (JSONObject) temp.get(i);
	res.add(jsonObj);
}

 

마지막으로, org.json.simple 패키지냐 org.json 패키지냐에 따라서 Casting을 아래와 같이 설정하면 됩니다.

org.json.simple.JSONObject sRow = res.get(j);
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기