Cannot invoke "org.json.simple.JSONArray.size()" because "array" is null

yeonn·2023년 12월 21일
0

error

목록 보기
11/13

springboot와 Open Api를 연결해 DB에 데이터를 저장하는 도중 에러 발생 1 😇

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데이터 스탭을 잘 살펴보아야겠다..!!

profile
개발자에 꽉 눌러 붙은 국문과생

0개의 댓글