반응형
두 번째 테스트 목적 : 파싱(json -> java)
공공데이터에서 받아온 json을
자바 오브젝트로 파싱 하기 위한
ResponseDto 클래스를 생성해준다.
package site.metacoding.hospapp.ex02;
import java.util.List;
import lombok.Data;
// public 클래스는 하나의 파일에 하나밖에 못만든다
// ResponseDto가 주인임
@Data
class Body {
private Items items;
private Integer numOfRows;
private Integer pageNo;
private Integer totalCount;
}
@Data
class Header {
private String resultCode;
private String resultMsg;
}
@Data
class Item {
private String addr;
private Integer mgtStaDd;
private String pcrPsblYn;
private String ratPsblYn;
private Integer recuClCd;
private String rprtWorpClicFndtTgtYn;
private String sgguCdNm;
private String sidoCdNm;
private String telno;
private Integer XPos;
private Double XPosWgs84;
private Integer YPos;
private Double YPosWgs84;
private String yadmNm;
private String ykihoEnc;
}
@Data
class Items {
private List<Item> item;
}
@Data
class Response {
private Header header;
private Body body;
}
@Data
public class ResponseDto {
private Response response;
}
3. 파싱
이전 테스트에서 데이터 다운로드까지 했다.
gson을 사용해
json 데이터를 자바 오브젝트에 넣어주자.
// 3. 파싱
Gson gson = new Gson();
ResponseDto responseDto = gson.fromJson(sbDownload.toString(), ResponseDto.class);
4. 검증
ResponseDto에 데이터들이
잘 들어왔는지 검증해보아야 한다.
// 4. 검증
int itemSize = responseDto.getResponse().getBody().getItems().getItem().size();
System.out.println("아이템 사이즈 : " + itemSize);
System.out.println("totalCount : " + responseDto.getResponse().getBody().getTotalCount());
System.out.println(responseDto);
10개의 병원 정보가 잘 들어왔고,
결과문에 =이 있는 것으로 보아
자바 오브젝트로 잘 변환되었다.
(json에는 =이 아닌 :(콜론)을 사용하기 때문!)
package site.metacoding.hospapp.ex02;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;
// 테스트 주도 개발!!
// 목적 : 파싱(json -> java) : gson
public class ParsingTest {
public static void main(String[] args) {
// 1. URL 주소 만들기(끝)
StringBuffer sbUrl = new StringBuffer();
sbUrl.append("http://apis.data.go.kr/B551182/rprtHospService/getRprtHospService");
sbUrl.append("?serviceKey="); // 서비스 키
sbUrl.append("서비스키%3D%3D");
sbUrl.append("&pageNo="); // 몇번째 페이지 인지
sbUrl.append("1");
sbUrl.append("&numOfRows=");
sbUrl.append("10"); // 한 페이지당 몇개씩 가져올지
sbUrl.append("&_type=");
sbUrl.append("json"); // 데이터 포맷은 JSON
// 2. 다운로드 받기(끝)
try {
// URL라이브러리가 ==을 %3D%3D로 바꿔줌 => url이 safe한 상태
// 쿼리 스트링 때문에!!
// 이미 인코드된 것을 또 인코드할 수도 있는데
// URL 라이브러리는 URL safe가 적용되어 있으면 더 이상 반영하지 않는다.
URL url = new URL(sbUrl.toString());
// http인지 https인지 모르기때문에 다운캐스팅해서 맞춰써라
// conn이 socket!
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "utf-8"));
StringBuffer sbDownload = new StringBuffer(); // 통신결과 모아두기
while (true) {
String input = br.readLine();
// 버퍼가 비었을 때 break
if (input == null) {
break;
}
sbDownload.append(input);
}
// 3. 파싱
Gson gson = new Gson();
ResponseDto responseDto = gson.fromJson(sbDownload.toString(), ResponseDto.class);
// 4. 검증
int itemSize = responseDto.getResponse().getBody().getItems().getItem().size();
System.out.println("아이템 사이즈 : " + itemSize);
System.out.println("totalCount : " + responseDto.getResponse().getBody().getTotalCount());
System.out.println(responseDto);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형