시작하기에 앞서 필요한 것.
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 를 보면 모든 데이터가 무사히 저장되었다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 이 게시판의 게시물들은 테스트 되지 않았음 | 황제낙엽 | 2019.08.28 | 445 |
5 | 안드로이드 API서버(API Server) | 황제낙엽 | 2019.03.24 | 862 |
4 |
화면회전(Orientation)에 따른 화면구성하기(레이아웃 분리) [2]
![]() | 황제낙엽 | 2018.12.05 | 73 |
3 | 화면회전(Orientation)에 따른 화면구성하기(레이아웃 분리) [1] | 황제낙엽 | 2018.12.05 | 76 |
» | 공공데이터 JSON 파싱하기 (HttpURLConnection, JSON) | 황제낙엽 | 2018.10.25 | 1491 |
1 | HttpURLConnection 을 이용하여 JSON데이터 읽어오는 샘플 | 황제낙엽 | 2018.10.25 | 144 |