최신 게시글(JAVA)
2019.05.29 / 24:23

5. Java로 기상청 API JSON으로 파싱하기

탁돌이개발자
추천 수 55

1. Java로 기상청 API JSON으로 파싱하기

이번에는 앞에서 배운것들을 모두 사용해서 Java로 기상청 API JSON으로 파싱을 해보겠습니다.


기상청 API JSON으로 파싱을 하기전에 필요한 정보들이 있습니다. 그것은 저번에 올린 글에서 확인한 내용과 동일한데요. 아래와 같습니다.


위에 있는 데이터를 아래와 같은 조합해서 URL를 작성해야합니다. 아래 URL이 좀 빠진 부분이 있더라구요 제가 해보니까 안되서 다른 것을을 찾다보니 서비스키 부분이 빠져있어서 제가 넣었습니다.



수정한 형태는 아래와 같습니다. 제가 Java로 코딩한 URL이여서 조금 달라보일 수 있습니다. 중간중간에 변수들에는 해당하는 정보를 넣어주시면 됩니다.

"http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?"+ "serviceKey=" + serviceKey + "&base_date=" + baseDate + "&base_time=" + baseTime + "&nx="+ nx + "&ny=" + ny + "&_type=json"; 





위 같은 정보를 확인하였스면 준비는 끝났습니다. 

하지만 제가 실제로 데이터를 파싱하려 하니까 문제가 발생했습니다. 제가 기존에 구조를 파악했던 데이터는 아래 사진과 같았는데 실제로 받은 데이터는 구조가 달랐습니다. 왜 그런지는 모르겠습니다. 그래서 소스코드 증간에 데이터를 확인하는 작업을 걸쳐서 다시 파싱했습니다.


홈페이지에서 받은데이터입니다.




자바를 통해서받은 데이터입니다.



이제부터는 소스코드를 보면서 주석으로 설명하겠습니다.

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class VillageWeatherParsing { public static void main(String[] args) { try{ /*요청정보입력 * 아래와 같은 정보들은 사용자 가이드를 확인하여 찾아주시면 됩니다. * 위도 경도는 엑셀파일 안에 있습니다. * */ //자신이 조회를 원하는 지역의 경도와 위도를 입력해주세요 String nx = "92"; //경도 String ny = "131"; //위도 String baseDate = "20180502"; // 자신이 조회하고싶은 날짜를 입력해주세요 String baseTime = "0500"; //자신이 조회하고싶은 시간대를 입력해주세요 // 서비스 인증키입니다. 공공데이터포털에서 제공해준 인증키를 넣어주시면 됩니다. String serviceKey = "개인별로 받은 인증키를 넣어주세요"; // 정보를 모아서 URL정보를 만들면됩니다. 맨 마지막 "&_type=json"에 따라 반환 데이터의 형태가 정해집니다. String urlStr = "http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?" + "serviceKey=" + serviceKey + "&base_date=" + baseDate + "&base_time=" + baseTime + "&nx="+ nx + "&ny=" + ny + "&_type=json"; URL url = new URL(urlStr); // 위 urlStr을 이용해서 URL 객체를 만들어줍니다. BufferedReader bf; String line = ""; String result=""; //날씨 정보를 받아옵니다. bf = new BufferedReader(new InputStreamReader(url.openStream())); //버퍼에 있는 정보를 하나의 문자열로 변환. while((line=bf.readLine())!=null){ result=result.concat(line); // System.out.println(result); // 받아온 데이터를 확인해봅니다. } // Json parser를 만들어 만들어진 문자열 데이터를 객체화 합니다. JSONParser parser = new JSONParser(); JSONObject obj = (JSONObject) parser.parse(result); // Top레벨 단계인 response 키를 가지고 데이터를 파싱합니다. JSONObject parse_response = (JSONObject) obj.get("response"); // response 로 부터 body 찾아옵니다. JSONObject parse_body = (JSONObject) parse_response.get("body"); // body 로 부터 items 받아옵니다. JSONObject parse_items = (JSONObject) parse_body.get("items"); // items로 부터 itemlist 를 받아오기 itemlist : 뒤에 [ 로 시작하므로 jsonarray이다 JSONArray parse_item = (JSONArray) parse_items.get("item"); String category; JSONObject weather; // parse_item은 배열형태이기 때문에 하나씩 데이터를 하나씩 가져올때 사용합니다. // 필요한 데이터만 가져오려고합니다. for(int i = 0 ; i < parse_item.size(); i++) { weather = (JSONObject) parse_item.get(i); //String base_Date = (String)weather.get("baseDate"); //String fcst_Time = (String)weather.get("fcstDate"); double fcst_Value = ((Long)weather.get("fcstValue")).doubleValue(); //실수로된 값과 정수로된 값이 둘다 있어서 실수로 통일했습니다. //String nX = (String)weather.get("nx"); //String nY = (String)weather.get("ny"); category = (String)weather.get("category"); //String base_Time = (String)weather.get("baseTime"); //String fcscDate = (String)weather.get("fcscDate"); // 출력합니다. System.out.print("배열의 "+i+"번째 요소"); System.out.print(" category : "+ category); System.out.print(" fcst_Value : "+ fcst_Value); System.out.println(); } // 마지막에보면 에러가 발생하였는데 casting문제입니다. // 이는 반환되는 데이터타입이 달라서인데 이번 글에서는 여기까지만하고 // 데이터베이스에 입력할때는 수정해서 하겠습니다. bf.close(); }catch(Exception e){ System.out.println(e.getMessage()); } } }


아래는 해당 소스코드의 실행결과입니다.

마지막에 보면 에러가 발생하는데 casting문제입니다. 이는 반환데는 데이터타입이 달라서인데 다음 글에서 데이터베이스와 연동할때 수정하겠습니다.


이것으로 이번 글은 마치겠습니다.  다음 글에서는 데이터베이스에 데이터를 넣는것을 해보겠습니다.



출처: https://kingpodo.tistory.com/16 [킹포도의 코딩]