새소식

인기 검색어

풀스택개발자_대학교 정규과정/프로젝트_throwsgg

open API 파싱하기(JSON)

  • -

API란, Application Programming Interface의 약자로, 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다.

OPEN API란, 사용자가 제공되는 데이터를 자유롭게 활용할 수 있도록 만들어놓은 인터페이스이다.

우리나라는 공공데이터 포털에서 각종 데이터들을 API형태로 제공해주고 있는데, 그 밖에 다양한 사이트에서도 제공해준다.

API로 제공되어지는 형태는 대부분 JSON이나 XML로 제공된다.

 

HttpURLConnection 객체 생성해서 url 연결하기

StringBuilder urlBuilder = new StringBuilder( "http://apis.data.go.kr/1543061/abandonmentPublicSrvc/abandonmentPublic"); /* URL */ urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "서비스키"); /* * Service * Key */ urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("6", "UTF-8")); /* 한 페이지 결과 수(1,000 이하) */ urlBuilder.append( "&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(pageNum, "UTF-8")); /* 페이지 번호 */ urlBuilder.append("&" + URLEncoder.encode("_type", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /* xml(기본값) 또는 json */ URL url = new URL(urlBuilder.toString()); // System.out.println(url.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); // System.out.println("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) { System.out.println(line); sb.append(line); } rd.close(); conn.disconnect(); return sb.toString();

먼저 JSONParser를 사용해서 String 값을 JSON 객체로 만들어준다.

이 때, 만들어진 JSON 객체는 JSONObject 클래스를 사용해서 저장된다.

만들어진 JSONObject에서 최종적으로 key가 item 인 value를 추출하기 위해서 get() 을 사용한다.

{ "response" : { "header" : { "reqNo" : 35362175, "resultCode" : "00", "resultMsg" : "NORMAL SERVICE." }, "body" : { "items" : { "item" : [ { "desertionNo" : "469569202200522", "filename" : "http://www.animal.go.kr/files/shelter/2022/09/202209012009963_s.jpg", "happenDt" : "20220901", "happenPlace" : "부강면 갈산산수로 237-9 일대", "kindCd" : "[개] 진도견", "colorCd" : "흰색", "age" : "2015(년생)", "weight" : "12(Kg)", "noticeNo" : "세종-세종-2022-00292", "noticeSdt" : "20220901", "noticeEdt" : "20220913", "popfile" : "http://www.animal.go.kr/files/shelter/2022/09/202209012009963.jpg", "processState" : "보호중", "sexCd" : "F", "neuterYn" : "U", "specialMark" : "심장사상충 양성, 목줄 착용, 순함", "careNm" : "세종유기동물보호센터", "careTel" : "010-4435-3720", "careAddr" : "세종특별자치시 전동면 미륵당1길 188 (전동면) ", "orgNm" : "세종특별자치시", "chargeNm" : "동물복지담당", "officetel" : "044-300-7615" }, { "desertionNo" : "469569202200521", "filename" : "http://www.animal.go.kr/files/shelter/2022/09/202209012009324_s.jpg", "happenDt" : "20220901", "happenPlace" : "조치원읍 봉산1길 84", "kindCd" : "[개] 믹스견", "colorCd" : "흰색", "age" : "2021(년생)", "weight" : "4(Kg)", "noticeNo" : "세종-세종-2022-00291", "noticeSdt" : "20220901", "noticeEdt" : "20220913", "popfile" : "http://www.animal.go.kr/files/shelter/2022/09/202209012009324.jpg", "processState" : "보호중", "sexCd" : "F", "neuterYn" : "U", "specialMark" : "심장사상충 음성", "careNm" : "세종유기동물보호센터", "careTel" : "010-4435-3720", "careAddr" : "세종특별자치시 전동면 미륵당1길 188 (전동면) ", "orgNm" : "세종특별자치시", "chargeNm" : "동물복지담당", "officetel" : "044-300-7615" }, { "desertionNo" : "448546202200457", "filename" : "http://www.animal.go.kr/files/shelter/2022/08/202209011009710_s.jpg", "happenDt" : "20220901", "happenPlace" : "안의면", "kindCd" : "[개] 치와와", "colorCd" : "연한황토", "age" : "2017(년생)", "weight" : "4(Kg)", "noticeNo" : "경남-함양-2022-00163", "noticeSdt" : "20220901", "noticeEdt" : "20220913", "popfile" : "http://www.animal.go.kr/files/shelter/2022/08/202209011009710.jpeg", "processState" : "보호중", "sexCd" : "F", "neuterYn" : "N", "specialMark" : "치와와 종류, 약 5살정도, 약 4kg 정도, 온순함, 유기견", "careNm" : "함양군위탁보호소", "careTel" : "055-960-8143", "careAddr" : "경상남도 함양군 함양읍 함양남서로 996-76 (함양읍, 농업기술센터) ", "orgNm" : "경상남도 함양군", "officetel" : "055-960-8140" },

json 추출 코드

public static AbandonList getDataList(String pageNum) throws IOException, ParseException { AbandonList list = new AbandonList(new ArrayList<DateAbandon>()); String result = ApiManagement.xmlDownload(pageNum); JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject) jsonParser.parse(result); JSONObject PetInfoResult = (JSONObject) jsonObject.get("response"); JSONObject PetInfoResult01 = (JSONObject) PetInfoResult.get("body"); JSONObject PetInfoResult02 = (JSONObject) PetInfoResult01.get("items"); JSONArray PetInfo = (JSONArray) PetInfoResult02.get("item");// item의 값은 여러개이기에 JSONArray 사용 String PetInfo_totalCount = String.valueOf(PetInfoResult01.get("totalCount")); for (int i = 0; i < PetInfo.size(); i++) { Gson gson = new Gson(); DateAbandon dateAbandon = gson.fromJson(PetInfo.get(i).toString(), DateAbandon.class); list.getList().add(dateAbandon); } return list; }

전체 코드 

package gg; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import vo.AbandonList; import vo.DateAbandon; public class ApiManagement { public static String xmlDownload(String pageNum) throws IOException { StringBuilder urlBuilder = new StringBuilder( "http://apis.data.go.kr/1543061/abandonmentPublicSrvc/abandonmentPublic"); /* URL */ urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "서비스키"); /* * Service * Key */ urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("6", "UTF-8")); /* 한 페이지 결과 수(1,000 이하) */ urlBuilder.append( "&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(pageNum, "UTF-8")); /* 페이지 번호 */ urlBuilder.append("&" + URLEncoder.encode("_type", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /* xml(기본값) 또는 json */ URL url = new URL(urlBuilder.toString()); // System.out.println(url.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); // System.out.println("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) { System.out.println(line); sb.append(line); } rd.close(); conn.disconnect(); return sb.toString(); } public static AbandonList getDataList(String pageNum) throws IOException, ParseException { AbandonList list = new AbandonList(new ArrayList<DateAbandon>()); String result = ApiManagement.xmlDownload(pageNum); JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject) jsonParser.parse(result); JSONObject PetInfoResult = (JSONObject) jsonObject.get("response"); JSONObject PetInfoResult01 = (JSONObject) PetInfoResult.get("body"); JSONObject PetInfoResult02 = (JSONObject) PetInfoResult01.get("items"); JSONArray PetInfo = (JSONArray) PetInfoResult02.get("item");// item의 값은 여러개이기에 JSONArray 사용 String PetInfo_totalCount = String.valueOf(PetInfoResult01.get("totalCount")); for (int i = 0; i < PetInfo.size(); i++) { Gson gson = new Gson(); DateAbandon dateAbandon = gson.fromJson(PetInfo.get(i).toString(), DateAbandon.class); list.getList().add(dateAbandon); } return list; } }
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.