본문 바로가기
  • 실행력이 모든걸 결정한다
OpenAPI/REST

[OpenAPI] 코로나 19 감염 현황(2) - 데이터 파싱

by 김코더 김주역 2021. 7. 30.
반응형

[예제 프로젝트 정보]

Editor Program : IntelliJ

Language : JAVA

 

 

1. 필요 라이브러리

JAVA 라이브러리를 쉽게 찾을 수 있는 사이트로, 필자가 개인적으로 강추한다.

https://mvnrepository.com/

 

1) 필요 라이브러리 목록

위 사이트에서 다음 라이브러리들을 검색해서 다운 받고 프로젝트에 적용시키면 된다.

  • Jackson Databind
  • Jackson Core
  • Jackson Annotations
  • JSON In Java (최신 버전들은 잘 안되는 경우가 많은데, 필자는 20180130 버전을 사용함)

 

 

2) 라이브러리 적용법

(1) 일반 JAVA 프로젝트 - IntelliJ

<1> bundle을 눌러 .jar 파일 설치

<2> File -> Project Structure -> Project Settings -> Dependencies -> Modules 에서 다운받은 .jar 추가

 

(2) 일반 JAVA 프로젝트 - Eclipse

.jar을 추가하는 내용이 포함된 포스팅 링크를 첨부함

https://kimcoder.tistory.com/236

 

(3) Maven 프로젝트

https://mvnrepository.com/ 참고

 

(4) Gradle 프로젝트

https://mvnrepository.com/ 참고

 

 

 

2. 응답 데이터 리뷰

이전 포스팅에서 작성한 URI 요청으로, 다음과 같은 응답 메세지를 받을 수 있었다.

 

필자는 JSON 형식의 데이터를 받고싶었지만, 해당 자료는 XML만 지원했다.

그러나 놀랍게도, org.json.XML에서는 XML String을 JSON Object로 변환해주는 toJSONObject(String) 메소드를 제공해준다!

XML 형식의 응답 메세지를 String 객체에 저장해서 toJSONObject() 메소드에 넣어주기만 하면, JSON 데이터를 바로 이용할 수 있는 상태가 되는 것이다.

 

 

 

3. JSONObject와 JSONArray

JSON Object의 배열을 JSONArray라고 한다.

 

1) JSON의 구조

JSON의 구조에 대해 잘 모른다면, 이 글을 읽고 숙지해둘 것을 권장한다.

http://www.tcpschool.com/json/json_basic_structure

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 

2) XML -> JSON 변환 구조 확인

XML 데이터를 JSON 데이터로 변환했을 때의 내용을 확인할 수 있는 방법 2가지를 소개한다.

이 방법들로 JSON의 구조를 익혀서 JSONObject, JSONArray를 어떻게 적용할지 설계하면 된다.

 

(1) JAVA 코드

JSONObject jsonObject = XML.toJSONObject(result); // org.json.JSONObject;

// json 데이터가 한줄로 출력 -> 보기 불편
System.out.println(jsonObject);

// json 데이터를 보기 좋게 출력
ObjectMapper mapper = new ObjectMapper(); // com.fasterxml.jackson.databind.ObjectMapper;
mapper.enable(SerializationFeature.INDENT_OUTPUT); // com.fasterxml.jackson.databind.SerializationFeature;
Object json = mapper.readValue(jsonObject.toString(), Object.class);
String jsonStr = mapper.writeValueAsString(json);
System.out.println(jsonStr);

 

(before) json 데이터가 한줄로 출력

{"response":{"header":{"resultCode":"00","resultMsg":"NORMAL SERVICE."},"body":{"pageNo":1,"totalCount":8,"items":{"item":[{"accDefRate":1.7272765905,"clearCnt":171559,"stateDt":20210729,"updateDt":null,"createDt":"2021-07-29 09:37:41.356","examCnt":342326,"accExamCnt":11637506,"stateTime":"00:00","deathCnt":2085,"decideCnt":195099,"resutlNegCnt":11100081,"accExamCompCnt":11295180,"careCnt":21455,"seq":587},{"accDefRate":1.7175707917,"clearCnt":170494,"stateDt":20210728,"updateDt":null,"createDt":"2021-07-28 09:36:06.387","examCnt":323954,"accExamCnt":11585615,"stateTime":"00:00","deathCnt":2083,"decideCnt":193427,"resutlNegCnt":11068234,"accExamCompCnt":11261661,"careCnt":20850,"seq":586},{"accDefRate":1.7071723951,"clearCnt":168629,"stateDt":20210727,"updateDt":"2021-07-27 10:08:37.339","createDt":"2021-07-27 09:35:45.815","examCnt":309414,"accExamCnt":11528609,"stateTime":"00:00","deathCnt":2079,"decideCnt":191531,"resutlNegCnt":11027664,"accExamCompCnt":11219195,"careCnt":20823,"seq":585},{"accDefRate":1.6992241235,"clearCnt":167365,"stateDt":20210726,"updateDt":null,"createDt":"2021-07-26 09:40:26.165","examCnt":281003,"accExamCnt":11472346,"stateTime":"00:00","deathCnt":2077,"decideCnt":190166,"resutlNegCnt":11001177,"accExamCompCnt":11191343,"careCnt":20724,"seq":584},{"accDefRate":1.6924008113,"clearCnt":166375,"stateDt":20210725,"updateDt":null,"createDt":"2021-07-25 09:32:34.468","examCnt":274761,"accExamCnt":11433347,"stateTime":"00:00","deathCnt":2073,"decideCnt":188848,"resutlNegCnt":10969738,"accExamCompCnt":11158586,"careCnt":20400,"seq":583},{"accDefRate":1.6794988233,"clearCnt":165246,"stateDt":20210724,"updateDt":null,"createDt":"2021-07-24 09:38:51.376","examCnt":274697,"accExamCnt":11430525,"stateTime":"00:00","deathCnt":2068,"decideCnt":187362,"resutlNegCnt":10968466,"accExamCompCnt":11155828,"careCnt":20048,"seq":582},{"accDefRate":1.6717199382,"clearCnt":164206,"stateDt":20210723,"updateDt":null,"createDt":"2021-07-23 09:37:34.575","examCnt":278011,"accExamCnt":11388305,"stateTime":"00:00","deathCnt":2066,"decideCnt":185733,"resutlNegCnt":10924561,"accExamCompCnt":11110294,"careCnt":19461,"seq":581},{"accDefRate":1.6624163319,"clearCnt":163073,"stateDt":20210722,"updateDt":null,"createDt":"2021-07-22 09:39:47.617","examCnt":269496,"accExamCnt":11343918,"stateTime":"00:00","deathCnt":2063,"decideCnt":184103,"resutlNegCnt":10890319,"accExamCompCnt":11074422,"careCnt":18967,"seq":580}]},"numOfRows":10}}}

 

(after) json 데이터가 계층 구조로 출력

{
  "response" : {
    "header" : {
      "resultCode" : "00",
      "resultMsg" : "NORMAL SERVICE."
    },
    "body" : {
      "pageNo" : 1,
      "totalCount" : 8,
      "items" : {
        "item" : [ {
          "accDefRate" : 1.7272765905,
          "clearCnt" : 171559,
          "stateDt" : 20210729,
          "updateDt" : null,
          "createDt" : "2021-07-29 09:37:41.356",
          "examCnt" : 342326,
          "accExamCnt" : 11637506,
          "stateTime" : "00:00",
          "deathCnt" : 2085,
          "decideCnt" : 195099,
          "resutlNegCnt" : 11100081,
          "accExamCompCnt" : 11295180,
          "careCnt" : 21455,
          "seq" : 587
        }, {
          "accDefRate" : 1.7175707917,
          "clearCnt" : 170494,
          "stateDt" : 20210728,
          "updateDt" : null,
          "createDt" : "2021-07-28 09:36:06.387",
          "examCnt" : 323954,
          "accExamCnt" : 11585615,
          "stateTime" : "00:00",
          "deathCnt" : 2083,
          "decideCnt" : 193427,
          "resutlNegCnt" : 11068234,
          "accExamCompCnt" : 11261661,
          "careCnt" : 20850,
          "seq" : 586
        }, {
          "accDefRate" : 1.7071723951,
          "clearCnt" : 168629,
          "stateDt" : 20210727,
          "updateDt" : "2021-07-27 10:08:37.339",
          "createDt" : "2021-07-27 09:35:45.815",
          "examCnt" : 309414,
          "accExamCnt" : 11528609,
          "stateTime" : "00:00",
          "deathCnt" : 2079,
          "decideCnt" : 191531,
          "resutlNegCnt" : 11027664,
          "accExamCompCnt" : 11219195,
          "careCnt" : 20823,
          "seq" : 585
        }, {
          "accDefRate" : 1.6992241235,
          "clearCnt" : 167365,
          "stateDt" : 20210726,
          "updateDt" : null,
          "createDt" : "2021-07-26 09:40:26.165",
          "examCnt" : 281003,
          "accExamCnt" : 11472346,
          "stateTime" : "00:00",
          "deathCnt" : 2077,
          "decideCnt" : 190166,
          "resutlNegCnt" : 11001177,
          "accExamCompCnt" : 11191343,
          "careCnt" : 20724,
          "seq" : 584
        }, {
          "accDefRate" : 1.6924008113,
          "clearCnt" : 166375,
          "stateDt" : 20210725,
          "updateDt" : null,
          "createDt" : "2021-07-25 09:32:34.468",
          "examCnt" : 274761,
          "accExamCnt" : 11433347,
          "stateTime" : "00:00",
          "deathCnt" : 2073,
          "decideCnt" : 188848,
          "resutlNegCnt" : 10969738,
          "accExamCompCnt" : 11158586,
          "careCnt" : 20400,
          "seq" : 583
        }, {
          "accDefRate" : 1.6794988233,
          "clearCnt" : 165246,
          "stateDt" : 20210724,
          "updateDt" : null,
          "createDt" : "2021-07-24 09:38:51.376",
          "examCnt" : 274697,
          "accExamCnt" : 11430525,
          "stateTime" : "00:00",
          "deathCnt" : 2068,
          "decideCnt" : 187362,
          "resutlNegCnt" : 10968466,
          "accExamCompCnt" : 11155828,
          "careCnt" : 20048,
          "seq" : 582
        }, {
          "accDefRate" : 1.6717199382,
          "clearCnt" : 164206,
          "stateDt" : 20210723,
          "updateDt" : null,
          "createDt" : "2021-07-23 09:37:34.575",
          "examCnt" : 278011,
          "accExamCnt" : 11388305,
          "stateTime" : "00:00",
          "deathCnt" : 2066,
          "decideCnt" : 185733,
          "resutlNegCnt" : 10924561,
          "accExamCompCnt" : 11110294,
          "careCnt" : 19461,
          "seq" : 581
        }, {
          "accDefRate" : 1.6624163319,
          "clearCnt" : 163073,
          "stateDt" : 20210722,
          "updateDt" : null,
          "createDt" : "2021-07-22 09:39:47.617",
          "examCnt" : 269496,
          "accExamCnt" : 11343918,
          "stateTime" : "00:00",
          "deathCnt" : 2063,
          "decideCnt" : 184103,
          "resutlNegCnt" : 10890319,
          "accExamCompCnt" : 11074422,
          "careCnt" : 18967,
          "seq" : 580
        } ]
      },
      "numOfRows" : 10
    }
  }
}

 

(2) XML <-> JSON 변환 사이트

- 눈으로 확인하는 용도로 사용할 것

https://www.utilities-online.info/xmltojson

 

XML to JSON & JSON to XML converter online

XML to JSON converter enables you to convert XML file to JSON file and vice versa. It converts the XML elements into the JSON keys within a fraction of seconds. How to convert XML to JSON? To convert XML code, follow the below easy steps: Write or paste XM

www.utilities-online.info

 

 

 

4. 코딩

<전체 소스 코드>

package demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import org.json.XML;
import org.json.JSONObject;
import org.json.JSONArray;

public class Example {
    public static void main(String[] args) {

        String servicekey = [여러분 계정의 서비스 키];
        String pageNo = "1";
        String numOfRows = "10";
        String startDate = "20210722";
        String endDate = "20210729";
        String result = "";

        try {
            // URI를 URL객체로 저장
            URL url = new URL("http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson" +
                    "?serviceKey=" + servicekey +
                    "&pageNo=" + pageNo +
                    "&numOfRows=" + numOfRows +
                    "&startCreateDt=" + startDate +
                    "&endCreateDt=" + endDate
            );
			
            
            // 버퍼 데이터(응답 메세지)를 읽어서 result에 저장
            // result에는 XML 형식의 응답 데이터가 String으로 저장되어 있음
            BufferedReader bf;
            bf = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
            result = bf.readLine();
            
            
            // XML String을 JSON Object로 변환
            JSONObject jsonObject = XML.toJSONObject(result);
			
            
            // 이제부터 json 데이터를 get() 메소드로 쉽게 찾을 수 있음
            JSONObject response = (JSONObject)jsonObject.get("response");
            JSONObject body = (JSONObject)response.get("body");
            JSONObject items = (JSONObject)body.get("items");
            JSONArray itemArr = (JSONArray)items.get("item");


            // 결과 출력
            System.out.println("---------------------------");
            for(int i=0; i<itemArr.length(); i++){
                JSONObject item = (JSONObject)itemArr.get(i);
                System.out.println("등록일 : "+item.get("createDt").toString().substring(0, 16));
                System.out.println("누적 검사 수 : "+item.get("accExamCnt"));
                System.out.println("누적 음성 수 : "+item.get("resutlNegCnt")); // api 내 오타?
                System.out.println("누적 확진자 수 : "+item.get("decideCnt"));
                System.out.println("누적 사망자 수 : "+item.get("deathCnt"));
                System.out.println("치료중 환자 수 : "+item.get("careCnt"));
                System.out.println("누적 확진률 : "+item.get("accDefRate").toString().substring(0, 4)+"%");
                System.out.println("---------------------------");
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

 

결과

---------------------------
등록일 : 2021-07-29 09:37
누적 검사 수 : 11637506
누적 음성 수 : 11100081
누적 확진자 수 : 195099
누적 사망자 수 : 2085
치료중 환자 수 : 21455
누적 확진률 : 1.72%
---------------------------
등록일 : 2021-07-28 09:36
누적 검사 수 : 11585615
누적 음성 수 : 11068234
누적 확진자 수 : 193427
누적 사망자 수 : 2083
치료중 환자 수 : 20850
누적 확진률 : 1.71%
---------------------------
등록일 : 2021-07-27 09:35
누적 검사 수 : 11528609
누적 음성 수 : 11027664
누적 확진자 수 : 191531
누적 사망자 수 : 2079
치료중 환자 수 : 20823
누적 확진률 : 1.70%
---------------------------
등록일 : 2021-07-26 09:40
누적 검사 수 : 11472346
누적 음성 수 : 11001177
누적 확진자 수 : 190166
누적 사망자 수 : 2077
치료중 환자 수 : 20724
누적 확진률 : 1.69%
---------------------------
등록일 : 2021-07-25 09:32
누적 검사 수 : 11433347
누적 음성 수 : 10969738
누적 확진자 수 : 188848
누적 사망자 수 : 2073
치료중 환자 수 : 20400
누적 확진률 : 1.69%
---------------------------
등록일 : 2021-07-24 09:38
누적 검사 수 : 11430525
누적 음성 수 : 10968466
누적 확진자 수 : 187362
누적 사망자 수 : 2068
치료중 환자 수 : 20048
누적 확진률 : 1.67%
---------------------------
등록일 : 2021-07-23 09:37
누적 검사 수 : 11388305
누적 음성 수 : 10924561
누적 확진자 수 : 185733
누적 사망자 수 : 2066
치료중 환자 수 : 19461
누적 확진률 : 1.67%
---------------------------
등록일 : 2021-07-22 09:39
누적 검사 수 : 11343918
누적 음성 수 : 10890319
누적 확진자 수 : 184103
누적 사망자 수 : 2063
치료중 환자 수 : 18967
누적 확진률 : 1.66%
---------------------------

 

 

 

5. 보충

만약 여러분이 URI 요청으로 JSON 데이터를 받았을 경우에는 어떻게 처리해야 할까?

 

해결방안은 간단하다.

JSON String을 JSONObject 클래스의 생성자로 넣어 생성된, 새 JSONObject 객체를 사용하면 된다.

String result = "";
result = [응답 받은 JSON String];

JSONObject jsonObject = new JSONObject(result); // org.json.JSONObject;

 

예시

 

반응형

'OpenAPI > REST' 카테고리의 다른 글

[OpenAPI] Postman 소개  (0) 2021.07.30
[OpenAPI] 코로나 19 감염 현황(1) - 데이터 받기  (1) 2021.07.30

댓글