원형 클래스
package mask;
import java.util.ArrayList;
import lombok.Data;
@Data
class MaskList {
private int count;
private int page;
ArrayList<StoreInfos> storeInfos;
@Data
class StoreInfos {
String addr;
String code;
Double lat;
Double lng;
String name;
String type;
}
private int totalCount;
private int totalPages;
}
먼저, 공공데이터포털에서 코로나 관련 공적 마스크 페이지를 불러온다.
https://www.data.go.kr/dataset/15043025/openapi.do
이 소스는 허가를 필요로 하지 않는 데이터로, 오픈 url이 있다.
이 url 데이터를 바탕으로 자바로 데이터 파일을 불러온다.
만들어진 json 페이지를 바탕으로 원형 클래스를 만든다.
이 때, storeInfo는 데이터 내부에 key-value 형태이므로 배열로 제작한다.
메인 매서드가 있는 자바 파일
package mask;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;
import com.google.gson.Gson;
import mask.MaskList.StoreInfos;
public class MaskApp {
public static int getTotalPages() {
try {
URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String input = "";
while ((input = br.readLine()) != null) {
sb.append(input);
}
br.close();
con.disconnect();
Gson gson = new Gson();
MaskList maskList = gson.fromJson(sb.toString(), MaskList.class);
return maskList.getTotalPages();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
public static MaskList GetPharmacyInfo(int page) {
try {
URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=" + page);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String input = "";
while ((input = br.readLine()) != null) {
sb.append(input);
}
br.close();
con.disconnect();
Gson gson = new Gson();
MaskList maskList = gson.fromJson(sb.toString(), MaskList.class);
return maskList;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
ArrayList<MaskList> Pharmacy = new ArrayList<>();
int total = getTotalPages();
for (int i = 1; i <= total; i++) {
MaskList GetPharmacy = GetPharmacyInfo(i);
Pharmacy.add(GetPharmacy);
}
System.out.println("지역을 입력해주세요.");
Scanner sc=new Scanner(System.in);
String area=sc.next();
for (MaskList m : Pharmacy) {
for (StoreInfos storyInfo : m.getStoreInfos()) {
if(storyInfo.getAddr().contains(area)) {
System.out.println(storyInfo.getAddr());
}
}
}
sc.close();
}
}
이 페이지의 질의 스트링은 하나 뿐이다. 페이지이다.
따라서, 페이지 넘버를 변수로 가져올 수 있는 메서드 하나, 데이터 전체를 가져올 수 있는 매서드 하나, 총 두 개의 매서드를 필요로 한다.
url과 httpopenconnection을 통해 스트림을 연결 후, bufferreader을 통해 버퍼를 연결한다.
readline을 통해 읽어온 데이터를 stringbuilder을 이용해 쌓아올린다.
이 받아온 json 데이터를 gson을 통해 자바 언어로 변경 한다.
메인 메서드는 빈 배열을 만들고, for이 있는 것이 stack 함수이기 때문에 지역변수가 된 값을 전역변수인 빈 배열로 끌어올린다. 이렇게 도출된 데이터를 contain을 통해 주소 내부에서 일치하는 값을 찾아내서 도출한다.
이 때, Pharmacy도 배열, StoreInfo도 다 배열이기 때문에 foreach 구문을 통해 두 변수를 다 반복시켜 모든 배열의 상태를 확인한다.
결과
반응형
'JAVA' 카테고리의 다른 글
17. 멀티 스레드 (0) | 2020.04.13 |
---|---|
16. 익명 클래스 (0) | 2020.04.13 |
JAVA 실습 9. 공공데이터와 Json을 이용한 항공데이터 조회하기 (0) | 2020.04.07 |
웹과 OSI 7계층 (0) | 2020.04.07 |
14. Json (0) | 2020.04.06 |