졸업프로젝트를 하면서 썼던 JSON parser에 대해 내가 보려고 정리함!
티맵 api를 이용해서 데이터를 받아오는거도 성공했는데
예시만 봐도 Response Parameter가 정말 많다.
우리가 저 많은 데이터를 전부 다 쓸건 아닌데 말이다!
특히 통합검색은 결과를 하나만 받아오는 것도 아니고..
결과 받아와본 것만 봐도 어지럽다..😂
확실히 저기서 필요한 데이터만 뽑아서 써야겠다는 생각이 들었다.
json 데이터로 받아오는데 저걸 필요한 것만 어떻게 가져오지?
그래서 찾아보다가 발견한게 JSON 파싱하는 것이었다.
먼저 JSON 파싱을 하기 위해 json-simple이라는 라이브러리를 사용하는데,
build.gradle에
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
이걸 추가해주면 된다.
아니면
IntelliJ에서 Project Structure 👉 Modules 👉 Dependencies 에서 + 를 누르고
1 JARs or Directories를 누르고 다운 받은 json-simple-1.1.1.jar 를 추가해주는 방법도 있다.
아무튼,
내가 필요한 데이터를 이제 json 파싱을 이용해서 뽑아와보자!
나는 searchPoiInfo의, pois의 poi 안의 middleAddrName,roadName,firstBuildNo 를 예시로 해보겠다.
어우 복잡해!😫
먼저 json 파싱하기 위해 JSONParser parser = new JSONParser(); 를 선언해주고,
searchPoiInfo에는 { } 안에 여러 데이터들이 객체로 들어있다.
티맵 데이터를 나는 result.getBody()를 통해 받아왔기 때문에 이걸 넣어준다.
4.[스프링]Spring RestTemplate 에 코드가 있음!
아무튼 그래서 JSONObject object = (JSONObject) parser.parse(result.getBody());
JSONObject searchPoiInfo = (JSONObject) object.get("searchPoiInfo");
그리고 그 안의 pois를 가져와야 하는데 이 안에 데이터가 또 { } 안의 객체로 들어있네?
그럼 얘도 JSONObject pois = (JSONObject) searchPoiInfo.get("pois");
그런데 그 안의 poi 안의 데이터가 [] 인걸보니 배열 형태이다.
배열은 JSONArray를 사용한다더라..
그래서 JSONArray poiArr = (JSONArray) pois.get("poi");
배열은 for문을 통해 poiArr의 크기만큼 돌려준 다음,
object = (JSONObject) poiArr.get(i); 를 통해 데이터를 얻어와준다.
이렇게 파싱을 해줬으니 이제 드디어 내가 필요한 데이터를 가져올 수 있다..
String middleAddrName = (String) object.get("middleAddrName");
String roadName = (String) object.get("roadName");
String firstBuildNo = (String) object.get("firstBuildNo");
을 해서 저 3가지 데이터를 뽑아서,
가공한 데이터를 findDto에 설정을 해서 그 findDto를 return 해오는 방식으로 작성했다.
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(result.getBody());
JSONObject searchPoiInfo = (JSONObject) object.get("searchPoiInfo");
JSONObject pois = (JSONObject) searchPoiInfo.get("pois");
JSONArray poiArr = (JSONArray) pois.get("poi");
for(int i = 0 ; i<poiArr.size();i++){
object = (JSONObject) poiArr.get(i);
String middleAddrName = (String) object.get("middleAddrName");
String roadName = (String) object.get("roadName");
String firstBuildNo = (String) object.get("firstBuildNo");
findDto.setMiddleAddrName(middleAddrName);
findDto.setRoadName(roadName);
findDto.setFirstBuildNo(firstBuildNo);
}
즉, 오브젝트의 경우는 JSONObject를, 배열일 경우는 JSONArray를 이용하면 된다.
JSONObject는 get("key의 값") 을 통해 받아오고, JSONArray는 get(index)를 통해 가져온 후에 받아오면 된다.
그렇게 내가 받아온 것을 테스트해 본 결과이다.
필요한 데이터만 뽑아서 쓰니까 훨~~씬 깔끔해졌다😉