IT/웹프로그래밍

Open API로 json 데이터 받아서 파싱하기 (json-simple 라이브러리)

thesse 2019. 8. 2. 21:43
300x250
반응형

API 데이터 살펴보기

한국수출입은행에서 제공하는 환율정보 API를 이용하여 json 파싱 실습을 하자.

인증키를 발급받고, 변수를 입력해서 요청 URL로 들어가보면

위와 같이 JSON 형태로 되어있음을 볼 수 있다.

우선은 이 URL과 연결해서 데이터를 얻어오는 것 부터 한다.

 

 

 

웹상에 있는 json 데이터 받아오기

<!DOCTYPE html>
<meta charset="utf-8">
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.net.*, java.io.*"%>

<html>
	<head>
	
		<%
			try{
				//매개변수 포함하여 api 주소 만들기
				String authkey = "(인증키)";
				String bDate = "20190802";
				String address = "https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey="
									+authkey+"&searchdate="+bDate+"&data=AP01";
				
				//객체 생성 및 url 연결
				URL url = new URL(address);
				URLConnection urlConn = url.openConnection();
                
				//데이터 받아오기
				InputStreamReader ir = new InputStreamReader(urlConn.getInputStream());
				BufferedReader br = new BufferedReader(ir);
				
				String line;
				line = br.readLine();
				
				//출력
				out.print(line);

				
				br.close();
				ir.close();
			} catch(Exception e){
				e.printStackTrace();
			}
		%>
		
	</head>
	<body>
		
	</body>
</html>

잘 받아와지는 것을 확인한다.

 

 

 

json-simple 라이브러리 추가

받아온 JSON 데이터를 파싱하기 위해 json-simple 라이브러리를 이용할 것이다.

jar파일을 다운받아 서버에 올린다.

(현재 노트패드로 우분투 서버에 직접 연결중이다. 이클립스로 로컬작업중일 땐 빌드패스로 추가해줘야 한다.)

 

 

 

json 데이터 파싱

<%@ page import="org.json.simple.*"%>
<%@ page import="org.json.simple.parser.JSONParser"%>

json-simple을 이용하기 위해 우선 이 두개를 추가해서 임포트한다.

 

<body>
		
			<table border=1px cellspacing=0px>
		<tr>
			<th>통화명 (통화코드)</th>
			<th>송금 받으실 때</th>
			<th>송금 보내실 때</th>
			<th>매매기준율</th>
			<th>장부가격</th>
			<th>년환가료율</th>
			<th>10일환가료율</th>
			<th>서울외국환중계<br>매매기준율</th>
			<th>서울외국환중계<br>장부가격</th>
		</tr>
		
				<%
				
				/***** 받아온 json 데이터 파싱하기 *****/
                
				//파서 객체 만들기
				JSONParser parser = new JSONParser();
				
				
				// json 데이터를 object로 만들기
				//JSONObject obj = (JSONObject)parser.parse(line);
				
				// json 데이터를 파싱하여 배열로 추출
				JSONArray arr = (JSONArray)parser.parse(line);
				//out.print(arr);	//배열로 잘 넘어왔나 확인
				
                
				// 통화별로 {} 묶여있으므로 배열 사이즈(=통화종류)만큼 반복
				for(int i=0; i<arr.size(); i++){
					
					// 배열 안에 있는 것도 json 형식이기 때문에 JSONObject로 추출
					JSONObject obj = (JSONObject)arr.get(i);
					
					String cur_unit = (String)obj.get("cur_unit");	//통화코드
					String cur_nm = (String)obj.get("cur_nm");	//국가/통화명
					String ttb = (String)obj.get("ttb");	//송금 받으실때
					String tts = (String)obj.get("tts");	//송금 보내실때
					String deal_bas_r = (String)obj.get("deal_bas_r");	//매매 기준율
					String bkpr = (String)obj.get("bkpr");	//장부가격
					String yy_efee_r = (String)obj.get("yy_efee_r");	//년환가료율
					String ten_dd_efee_R = (String)obj.get("ten_dd_efee_R");	//10일환가료율
					String kftc_deal_bas_r = (String)obj.get("kftc_deal_bas_r");	//서울외국환중계 매매기준율
					String kftc_bkpr = (String)obj.get("kftc_bkpr");	//서울외국환중계 장부가격
					
                    
					// 출력
				%>
					<tr>
						<td><%=cur_nm%> (<%=cur_unit%>)</td>
						<td><%=ttb%></td>
						<td><%=tts%></td>
						<td><%=deal_bas_r%></td>
						<td><%=bkpr%></td>
						<td><%=yy_efee_r%></td>
						<td><%=ten_dd_efee_R%></td>
						<td><%=kftc_deal_bas_r%></td>
						<td><%=kftc_bkpr%></td>
					</tr>	
				<%
				}
				
				br.close();
				ir.close();
                
			} catch(Exception e){	//위에서 URLConnection 만들때 연 try 닫는것
				e.printStackTrace();
			}
		%>
		
		
	</body>

보통 JSONObject로 먼저 받아오는 것 같은데,

여기서 사용하는 API는 [로 시작해서 ]로 끝나기 때문에 전체를 하나로 배열로 보는 것 같다.

그래서 바로 JSONArray로 파싱해야 하는 듯하다.

 

주석처리한 JSONObject objJSONObject obj = (JSONObject)parser.parse(line); 를 실행하면 아래 에러문구가 뜬다.

java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject

 

 

 

 

 

json 데이터를 가져와서 각각의 요소를 뽑아내는 것까지 마쳤다.

이제 뽑아낸 데이터를 가지고 원하는 페이지를 만들면 된다.

300x250
반응형