시작하기에 앞서 필요한 것.

 

1. 인터넷 권한과 2. GSON

 

<uses-permission android:name="android.permission.INTERNET" />

 

implementation 'com.google.code.gson:gson:2.8.2'

 

오늘의 파싱대상은 오픈API를 제공중인 공공데이터 대기오염정보.

공공데이터에 들어가서 자바 예제를 그대로 복사 붙여넣기한다.

 

StringBuilder urlBuilder = new StringBuilder("http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty"); /*URL*/

        urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "="+ serviceKey); /*Service Key*/

        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/

        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/

        urlBuilder.append("&" + URLEncoder.encode("sidoName","UTF-8") + "=" + URLEncoder.encode(location, "UTF-8")); /*시도 이름 (서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종)*/

        urlBuilder.append("&" + URLEncoder.encode("ver","UTF-8") + "=" + URLEncoder.encode("1.3", "UTF-8")); /*버전별 상세 결과 참고문서 참조*/

        urlBuilder.append("&_returnType=json");

 

        Log.i("TM", urlBuilder.toString());

 

        URL url = new URL(urlBuilder.toString());

 

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");

        conn.setRequestProperty("Content-type", "application/json");

        Log.i("Response code: " , conn.getResponseCode()+"");

        BufferedReader rd;

 

        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {

            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        } else {

            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));

        }

        StringBuilder sb = new StringBuilder();

        String line;

        while ((line = rd.readLine()) != null) {

            sb.append(line);

        }

     

        rd.close();

        conn.disconnect();

 

    }

 

공공데이터는 기본 타입이 XML 이므로 JSON 으로 데이터를 받아오려면 쿼리스트링을 따로 추가해주어야 한다.

대기오염정보는 &_returnType=json 를 추가해주면 된다.

제공하는 공공데이터마다 쿼리스트링이 조금씩 다르게 생긴듯.

서비스키는 알아서 넣도록 하고 요청이 제대로 되는지 확인하자.

 

url 요청이 제대로 되었다면 뭘 파싱할 지 알아야 하니 json 을 보기 쉽게 정리해주자.

https://www.freeformatter.com/ 같은 사이트들을 이용하면 됨.

데이터를 저장할 VO 역시 이 사이트를 이용해서 생성해두도록 하자.

 

public class CityVO implements Serializable{

 

    private String returnType;

    private String coGrade;

    private String coValue;

    private String dataTerm;

    private String dataTime;

    private String khaiGrade;

    private String khaiValue;

    private String mangName;

    private String no2Grade;

    private String no2Value;

    private String numOfRows;

    private String o3Grade;

    private String o3Value;

    private String pageNo;

    private String pm10Grade;

    private String pm10Grade1h;

    private String pm10Value;

    private String pm10Value24;

    private String pm25Grade;

    private String pm25Grade1h;

    private String pm25Value;

    private String pm25Value24;

    private String resultCode;

    private String resultMsg;

    private Integer rnum;

    private String serviceKey;

    private String sidoName;

    private String so2Grade;

    private String so2Value;

    private String stationCode;

    private String stationName;

    private String totalCount;

    private String ver;

 

{

   "list": [

      {

         "_returnType": "json",

         "coGrade": "1",

         "coValue": "0.4",

         "dataTerm": "",

         "dataTime": "2018-08-27 15:00",

         "khaiGrade": "",

         "khaiValue": "-",

         "mangName": "도시대기",

         "no2Grade": "1",

         "no2Value": "0.015",

         "numOfRows": "10",

         "o3Grade": "1",

         "o3Value": "0.016",

         "pageNo": "1",

         "pm10Grade": "",

         "pm10Grade1h": "2",

         "pm10Value": "31",

         "pm10Value24": "-",

         "pm25Grade": "1",

         "pm25Grade1h": "1",

         "pm25Value": "11",

         "pm25Value24": "13",

         "resultCode": "",

         "resultMsg": "",

         "rnum": 0,

         "serviceKey": "",

         "sidoName": "",

         "so2Grade": "1",

         "so2Value": "0.004",

         "stationCode": "",

         "stationName": "광복동",

         "totalCount": "",

         "ver": ""

      }

   ],

   "totalCount": 22

}

 

받아오는 데이터는 이 아래로도 이것저것 많지만 우리가 필요한건 "list" 아래의 도시정보들이다.

처음에 받아오는 json 은 JSONObject 이고 list 의 내용물은 여러개이므로 JSONArray 로 받아와야 한다.

스트링빌더 sb 를 JSONObject 에 집어넣어 새 객체를 만들자.

 

  JSONObject response = new JSONObject(sb.toString());

  JSONArray list = (JSONArray) response.get("list");

 

  Gson gson = new Gson();

  cityVOS = gson.fromJson(list.toString(), new TypeToken<ArrayList<CityVO>>(){}.getType());     

 

끝. cityVOS 를 보면 모든 데이터가 무사히 저장되었다.