Controller에서 DB를 저장하면 index.html로 이동하도록 구현해보았다.
Cannot invoke "org.json.simple.JSONArray.size()" because "array" is null 에러가 발생하면서 DB에 데이터가 저장되지 않았다.
Open Api의 데이터를 살펴보니 json데이터 스탭이
response - body - items - item 이었다.
나는 response - body - item 스탭으로 파싱해주었다.
items 스탭을 건너뛰어서 발생하는 오류인가 싶어서
response - body - items - item 스탭으로 파싱을 해주었다.
그랬더니 에러가 해결되었다!!
import com.example.openapi.areaCode1.AreaCode1;
import com.example.openapi.areaCode1.repository.AreaCode1Repository;
import lombok.RequiredArgsConstructor;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.web.bind.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
@RestController
@RequiredArgsConstructor
public class AreaCode1Controller {
private final AreaCode1Repository areaCode1Repository;
@RequestMapping("/api")
public String save() throws IOException {
String result = "";
try {
String urlStr = "https://apis.data.go.kr/B551011/KorWithService1/areaCode1?serviceKey=DkOIez19CK8KPQ7NAXAWmrxGloo6Dzw70qjMaDakfJIAQu3liUaNPQO83aGA9Om%2FGk%2FsIZEgyxY0H8sBp%2FLMfg%3D%3D&numOfRows=25&pageNo=1&MobileOS=ETC&MobileApp=AppTest&areaCode=1&_type=json";
URL url = new URL(urlStr);
BufferedReader br;
br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
result = br.readLine();
//JSON 파싱 객체를 생성
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(result);
//response를 받아옴
JSONObject parseResponse = (JSONObject) jsonObject.get("response");
//parseResponse에는 response 내부의 데이터들이 들어있음
//body를 받아옴
JSONObject parseBody = (JSONObject) parseResponse.get("body");
//parseBody에는 body 내부의 데이터들이 들어있음
//Items를 받아옴 -> 해당 부분을 추가해주었다.
JSONObject parseItems = (JSONObject) parseBody.get("items");
//parseItems에는 items 내부의 데이터들이 들어있음
//item 안쪽의 데이터는 [] 즉 배열의 형태이기에 제이슨 배열로 받아온다.
JSONArray array = (JSONArray) parseItems.get("item");
for(int i=0; i<array.size(); i++) {
JSONObject tmp = (JSONObject)array.get(i);
AreaCode1 areaCode1 = new AreaCode1(
i+(long)1,
(long)tmp.get("rnum"),
(String)tmp.get("code"),
(String)tmp.get("name"));
areaCode1Repository.save(areaCode1);
}
} catch (Exception e) {
e.printStackTrace();
}
return "index";
}
}
역시 데이터가 구성되어있는 스탭대로 파싱해주지 않아서 발생한 에러였다.
사용하는 Open Api의 json데이터 스탭을 잘 살펴보아야겠다..!!