[Spring MVC 프로젝트 - 기상 예보 API 사용하기] JSON 객체에서 원하는 값 추출하기

J_m2n·2023년 8월 20일
0

저번 글에서 공공데이터 포털 오픈 API로 기상청 날씨 정보 가져오는 방법을 포스팅했다.


이번에는 JSON 형태로 받아온 날씨 정보 데이터에서 필요한 정보를 뽑아오는 방법을 알아볼게요.

기상청 단기예보 API로 데이터를 가져오면 위 사진 처럼 발표일~3일까지의 매 시간마다 다양한 날씨정보(기온, 강수확률, 풍량)가 엄청난 양으로 쏟아져 나온다.

BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        String sb = "";
        String line;
        while ((line = rd.readLine()) != null) {
            sb += line;
        }

BufferReader 변수인 rd로 해당 데이터들을 읽어와서 readLine()함수로 한 줄씩 읽어와서 String 변수인 sb에 몽땅 붙여버린다.


그래서 String 변수 sb에 위 데이터가 엄청나게 긴 문자열로 담겨있다.


우리는 이 문자열 sb를 JSON 객체로 파싱해서 정보를 추출할 것이다.
JSON 관련 함수나 JSON 객체로 파싱하기 위해서는 json 의존성을 추가해야한다.

<dependency>
	<groupId>com.googlecode.json-simple</groupId>
	<artifactId>json-simple</artifactId>
	<version>1.1.1</version>
</dependency>

pom.xml에 json-simple 의존성을 추가한다.
그리고 꼭!! 메이븐 업데이트와 메이븐 install까지 해주기!!


의존성 추가를 마쳤다면 해당 자바 파일의 윗부분에 json을 import 해줘야 한다.
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import문까지 작성을 완료했다면 이제 문자열 sb를 JSON 객체로 파싱할 차례이다.

JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject)jsonParser.parse(sb);

JSONParser 클래스 변수인 jsonParser 객체를 먼저 생성 후, JSONParser 클래스에 내제된 함수인 .parse를 통해 sb를 JSONObject 객체로 형변환 해준다.



다시 한번 이 데이터를 보면, response라는 key에 해당되는 value가 header, body, items라는 key에 value를 가지는 JSON 객체로 구성되어 있고, 우리가 원하는 데이터는 "items" key의 value 값인 "item" 키의 value에 들어있다.


그래서 가장 큰 "response"에서 차근차근 안으로 파고 들어야한다.

JSONObject response = (JSONObject)jsonObject.get("response");

문자열 sb를 JSON 객체로 만든 jsonObject에서 .get(key)함수를 사용하여 "response" 키의 value를 가져와서 response라는 JSON 객체를 만든다.


JSONObject body = (JSONObject)response.get("body");
JSONObject items = (JSONObject)body.get("items");

똑같이 body와 items도 get함수를 통해 value를 가져온다.

JSONArray item = (JSONArray)items.get("item");

여기서 item은 JSONArray로 가져온 이유는


"item"키의 value가 []로 감싸져있기 때문에 JSONArray 형태인 것이다.


JSONArray인 item 배열도 안의 값들은 JSON 객체 형태이기 때문에 반복문을 돌면서 .get(index)함수를 이용하여 item.get(i)로 각 배열의 인덱스의 JSON 객체를 가져온다.

JSONObject data = (JSONObject)item.get(i);

이제 이 data 객체에서 원하는 key의 value를 가져오기만 하면 끝!!
data.get(key)로 가져오면 됩니다!!


기상청 중기예보 API도 위 방법과 똑같이 정보를 뽑아왔음.

지점을 선택하면 해당 지점의 지역 좌표가 AJAX함수로 Controller를 통해 DAO로 넘겨지고, DAO에서 데이터 처리를 한 후 다시 jsp로 결과값이 넘어온다.


그러면 페이지 전환 없이 해당 지점이 있는 지역의 7일 간의 날씨 정보가 뜨게 된다~~!😊

profile
코딩 초짜입니다

2개의 댓글

comment-user-thumbnail
2024년 4월 9일

참고 잘했어용 덕분에 토이프로젝트 기능 하나 추가합니다~

1개의 답글