심심한잉여의 잡동사니

JAVA - 세미프로젝트 네이버 검색API JSON 파싱 본문

코딩일기/Java

JAVA - 세미프로젝트 네이버 검색API JSON 파싱

심심한잉여 2021. 11. 22. 23:04
반응형

세미프로젝트를 진행하며 전기차 관련 뉴스 데이터를 직접 만들기보다 살아있는 실제 데이터를 가져오는것이 좋을 것 같아 네이버 검색 API를 활용해보고자 하였다.
API를 사용하는 것은 처음이라 해매긴 했다.

네이버 검색 API는 블로그 검색에만 대표적으로 뼈대가 될 예제코드가 올라가져있다.
하지만 이 부분을 못보고 바로 뉴스 검색으로 들어가서 찾느라 시간을 많이 허비했다..
이 글을 보는 사람들은 그러지 않길 바란다.

이제 블로그 검색에서 예제 코드를 가져오고

GET부분을 위 뉴스 검색으로 변경하면 좋다.
원래 파싱이 편한 XML로 가져오려고 했으나 JSON이 불필요한 코드가 덜 들어가서 JSON으로 가져오는것이 낫다고 판단하여 JSON으로 가져왔다.

필요에 따라 요청 변수를 위 URL에 파라메터로 적어주는 것이 좋다.
검색어에 대해서만 적혀져 있으니 확인 후 상황에 맞춰 요청하자.

위 코드처럼 콘솔로 출력되는 내용을 파싱해야하니 리턴될 수 있도록 수정해줬다.

deleteAllNewsAPI(); // 기존에 저장된 API내용 최신화를 위해 삭제 메서드 입력
String newsJson = ApiExamSearchNews.newsJson(); // 파싱을 위한 리턴 값 가져오기
String[] passingSplit = newsJson.split("\"items\": \\["); // 앞 잉여데이터 삭제
passingSplit = passingSplit[1].split("\\]\\}"); // 뒤 잉여데이터 삭제
passingSplit = passingSplit[0].split("}"); // 각 아이템별로 데이터 나누기
for (int i = 0; i < passingSplit.length; i++) {
	passingSplit[i] = passingSplit[i].replace(",{", "").replace("{", ""); // 괄호 삭제
	}
	String[][] rowDataArr = new String[passingSplit.length][]; // ROW데이터를 담기위한 2차원 배열
	for (int i = 0; i < passingSplit.length; i++) {
		rowDataArr[i] = passingSplit[i].split("\",\""); // 따움표 삭제 
		for (int j = 0; j < rowDataArr[i].length; j++) {
			rowDataArr[i][j] = rowDataArr[i][j].replaceAll("<b>", "").replaceAll("</b>", "") // DB에 담을 값에서 필요 없는 HTML 삭제
					.replaceAll("&quot;", "").strip(); // 필요없는 코드 및 앞 뒤 공백 삭제
		}
	}

	List<Map<String, String>> jsonList = new ArrayList<Map<String, String>>(); // ROW데이터로 분리될 객체MAP을 담을 LIST 

	for (int i = 0; i < rowDataArr.length; i++) {
		Map<String, String> newsMap = new HashMap<String, String>(); // ROW데이터를 분리할 맵
		for (int j = 0; j < rowDataArr[i].length; j++) {
			String[] rowDataInfo = rowDataArr[i][j].split("\":"); // :로만 나누면 엉뚱하게 나눠지는 내용도 있어 ": 로 스플릿
			newsMap.put(rowDataInfo[0].replaceAll("\"", "").strip(), rowDataInfo[1].replaceAll("\"", "").strip()); // 이후 값에서 따움표 삭제 
		}
		jsonList.add(newsMap); // 아이템별로 MAP값 입력 for문이 돌면서 다시 map을 생성하니 참조ID가 달라서 중복 안됨

		}

위 코드와 같이 파싱을 진행해 주었다.
하지만 문제가 있었다.
네이버로 받아지는 날짜에 대한 값의 month 내용이 영문이라서 JDBC를 통해 값 입력이 불가능했다.

따라서 if문을 통해 값을 변환해주었다.

String month = jsonList.get(i).get("pubDate").substring(8,12).toUpperCase().strip(); 
/* upperCase를 통해 안정성을 높였으며 sept이 들어올 것을 생각하여 공백 포함 4글자를 subStrig했다.
*  그리고나서 공백을 제거하여 안정성을 높였다. 성능에는 큰 차이가 없을 것 같아 안정성을 좀 더 추구하는 방향으로 진행했다.
*/
			
			if(month.equals("JAN")) {
				month="1";
			}else if(month.equals("FEB")) {
				month="2";
			}else if(month.equals("MAR")) {
				month="3";
			}else if(month.equals("APR")) {
				month="4";
			}else if(month.equals("MAY")) {
				month="5";
			}else if(month.equals("JUN")) {
				month="6";
			}else if(month.equals("JUL")) {
				month="7";
			}else if(month.equals("AUG")) {
				month="8";
			}else if(month.equals("SEPT")) {
				month="9";
			}else if(month.equals("OCT")) {
				month="10";
			}else if(month.equals("NOV")) {
				month="11";
			}else if(month.equals("DEC")) {
				month="12";
			}

month에 대해 파싱을 할 때 toUpperCase를 통해 안정성을 높였으며 sept이 들어올 것을 생각하여 공백 포함 4글자를 subStrig했다.
그리고나서 공백을 제거하여 안정성을 높였다. 성능에는 큰 차이가 없을 것 같아 안정성을 좀 더 추구하는 방향으로 진행했다.

이로서 파싱은 완료되었고 문제없이 JDBC를 통해 DB에 정상적으로 입력이 된 것을 확인했다.

GSON이라는 라이브러리를 사용하면 더욱 쉽게 파싱이 가능하다.

반응형

'코딩일기 > Java' 카테고리의 다른 글

HTTP와 HTTPS의 이해  (0) 2022.03.12
[Java]자바의 메모리 구조  (0) 2022.03.11
JAVA - strip();  (0) 2021.11.21
JAVA - startsWith, endsWith  (0) 2021.10.16
JAVA - 배열을 LIST로 넣는 방법  (0) 2021.10.13