서울시 공공 와이파이 api 이용하여 Json 파싱하기
서울시 공공 와이파이 서비스 정보를 이용하여 파싱하는 방법에 대해 작성하고자 한다.
우선 서울시 공공 와이파이 서비스 정보를 가져오기 위해서는 서울시 열린데이터 광장에 들어가서 KEY 를 먼저 발급 받아야한다.
발급 받은 api 를 어떻게 사용해야하는지 나와있다.
이것을 참고해서 보면 api 를 통해서 데이터는 xml, json 형태로 받을 수 있다는 것을 알 수있다.
json 형태로 받기 위해서는 샘플 url 에서 (인증키)/json 으로 수정하여 사용하면 된다.
참고로 파싱하는 과정은 인텔리제이를 통하여 진행하였다.
json 파싱하기 위해서는 우선 json 라이브러리를 다운 받아야한다. 다운 받은 라이브러리를 프로젝트에 추가해주면 된다.
Google Code Archive - Long-term storage for Google Code Project Hosting.
code.google.com
키와 Json 라이브러리를 추가를 해줬다면 이제 코드를 작성하자.
Api 를 사용하기 위에서 봤던 샘플 url 처럼 형태를 만들어 줘야한다.
String baseUrl = "http://openapi.seoul.go.kr:8088/" + KEY + "/" +
"json/TbPublicWifiInfo/";
baseUrl = baseUrl + start + "/" + end + "/";
여기서 Key 는 발급 받은 인증키를 의미하고, start 는 시작하는 첫 페이지의 번호, end 는 끝 지점을 써주면 된다.
참고로 한번에 받을 수 있는 최대 데이터는 1000개 이하이다.
아래 전체 코드에서 보면 전체 데이터의 수를 받아서 연산하는 과정이 추가 되어 있다.
이것은 전체 데이터를 가져오기 위함이다.
일부분 데이터를 가져오고 싶으면 start, end 의 숫자만 조정하면 된다.
URL url = null;
HttpURLConnection con= null;
JSONObject result = null;
StringBuilder sb = new StringBuilder();
Json 형태로 받아올 변수들도 지정해준다.
try {
url = new URL(baseUrl);
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Content-type", "application/json");
con.setDoOutput(true);
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
while(br.ready()) {
sb.append(br.readLine());
}
con.disconnect();
}catch(Exception e) {
e.printStackTrace();
}
여기서는 api 를 통해서 값을 가져오는 코드이다.
가져온 값들은 sb 에 모두 저장이 된다.
result = (JSONObject) new JSONParser().parse(sb.toString());
sb를 JSONObject 으로 변환하여 저장한다.
데이터를 가져오기 전에 먼저 데이터를 가져온 형태에 대해 알아두면 이해가 쉽다.
JSONObject data = (JSONObject) result.get("TbPublicWifiInfo");
get("TbPublicWifiInfo") 을 하면 TbPublicWifiInfo 을 찾아 여기 있는 데이터를 전부 JsonObject 형태로 가져오게 된다.

JSONArray array = (JSONArray) data.get("row");
api 를 뜯어 보면 가져오려는 필요한 정보는 모두 row 안에 있다.
row 가 요청한 데이터의 수만큼 존재한다. 이것을 전부 가져오기 위해서는 JsonArray 형태로 가져올 수있다.
tmp = (JSONObject) array.get(i);
이것을 하게 되면 배열의 i 번째 데이터를 다시 JSONObject 형태로 받아와 원하는 데이터에 접근 할 수 있다.

각각의 데이터에 접근 하기 위해서는 tmp.get("X_SWIFI_MGR_NO") 을 이용하면 된다.
전체 코드