관리 메뉴

웹개발자의 기지개

java 미세먼지경보 open API JSON으로 파싱하기1 ( json 객체화 ) 본문

Java

java 미세먼지경보 open API JSON으로 파싱하기1 ( json 객체화 )

http://portfolio.wonpaper.net 2019. 12. 2. 09:25

요즘 open API로 많이들 접속해서 연동하는 사이트가 있다.

https://www.data.go.kr/

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

먼저 미세먼지 관련 정보를 검색하고 신청하고 승인을 받자 그래야 서비스 인증키를 받아서, 결과를 돌려볼 수 가 있다.

참고문서를 보고 xml 이나 json 형식으로 데이터에 따라 선택적으로 response 결과값을 받아 볼 수가 있다.

하단부에 원하는 형식때로 미리보기하여 데이터를 예시적으로 다운받을 수 도 있다.

 

미세먼지json2.json
0.26MB

이클립스로 java 작성해보자.

우선은 json 데이터를 객체화 시키는 라이브러리를 찾아서 추가해야 한다.

https://code.google.com/archive/p/json-simple/downloads

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

json-simple-1.1.1.jar
0.02MB

이클립스 파일 > 속성 클릭하여 해당 라이브러리 jar 파일을 추가시켜 놓자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
 
public class JsonExam1 {
 
    public static void main(String[] args) {
        // 미세먼지 경보 정보 조회 서비스 - 한국환경공단 api 서비스
        try {
            // 인증키
            String serviceKey = "인증키값";
            
            String urlStr = "http://openapi.airkorea.or.kr/openapi/services/rest/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo";
            urlStr += "?"+ URLEncoder.encode("ServiceKey","UTF-8"+"=" + serviceKey;
            urlStr += "&"+ URLEncoder.encode("numOfRows","UTF-8"+"=200";
            urlStr += "&"+ URLEncoder.encode("pageNo","UTF-8"+"=1";
            urlStr += "&"+ URLEncoder.encode("year","UTF-8"+"=2019";
            urlStr += "&"+ URLEncoder.encode("_returnType","UTF-8"+"=json";
            
            URL url = new URL(urlStr);
            
            String line = "";
            String result = "";
            
            BufferedReader br;
            br = new BufferedReader(new InputStreamReader(url.openStream()));
            while ((line = br.readLine()) != null) {
                result = result.concat(line);
                //System.out.println(line);                
            }            
            
            // JSON parser 만들어 문자열 데이터를 객체화한다.
            JSONParser parser = new JSONParser();
            JSONObject obj = (JSONObject)parser.parse(result);
            
            // list 아래가 배열형태로
            // {"list" : [ {"returnType":"json","clearDate":"--",.......} ] 
            JSONArray parse_listArr = (JSONArray)obj.get("list");
            
            String miseType = "";
            
            // 객체형태로
            // {"returnType":"json","clearDate":"--",.......},... 
            for (int i=0;i< parse_listArr.size();i++) {
                JSONObject weather = (JSONObject) parse_listArr.get(i);
                String dataDate = (String) weather.get("dataDate");            // 발령날짜
                String districtName = (String) weather.get("districtName");    // 발령지역
                String moveName = (String) weather.get("moveName");            // 발령권역
                String issueDate = (String) weather.get("issueDate");        // 발령일자
                String issueTime = (String) weather.get("issueTime");        // 발령시간
                String issueVal  = (String) weather.get("issueVal");        // 발령농도
                String itemCode  = (String) weather.get("itemCode");        // 미세먼지 구분 PM10, PM25
                String issueGbn  = (String) weather.get("issueGbn");        // 경보단계 : 주의보/경보
                String clearDate = (String) weather.get("clearDate");        // 해제일자
                String clearTime = (String) weather.get("clearTime");        // 해제시간
                String clearVal = (String) weather.get("clearVal");            // 해제시 미세먼지농도
                
                if (itemCode.equals("PM10")) {            
                    miseType = "";
                } else if (itemCode.equals("PM25")) {    
                    miseType = "초미세먼지";
                }
                StringBuffer sb = new StringBuffer();
                sb.append("발령날짜 : " + dataDate + ", 지역 : " + districtName + " ("+ moveName +"), " + "발령시간 : "+ issueDate + " " + issueTime + ", 농도 : " + issueVal + " ("+ issueGbn +") " + miseType);
                System.out.println(sb.toString());                
            }
            
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
}
cs

[ 실행화면 ]

 

 

Comments