• Spring Boot 복잡한 JSON 파싱

    2022. 2. 13.

    by. 순일

    프로젝트를 진행하던 중 스포티파이 API를 이용하게 되었는데 요청받은 JSON 데이터가 너무 복잡한 형태로 이루어져 있어서 구글링을 통해 알게 된 내용들과, 해결한 방법에 대해 정리를 하고자 한다.

     

    먼저 JSON 파싱을 위해 json-simple이라는 라이브러리를 사용한다.

    프로젝트는 Gradle를 사용하였고, build.gradle 파일 안에 dependencies 부분에 한 줄 추가해준다.

    implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'

     

    가공할 데이터에 대해 간단한 구조를 설명하고 이후 해결 방식을 설명할 예정이다.

    일단 사진만 봐도 복잡한 것을 알 수 있는데, 가장 크게 오브젝트로 감싸 져 있고 그 안에 tracks는 배열 형태로 감싸 져 있고 다시 안에 오브젝트로 감싸 져 있고 이런 방식으로 되어있다. 아래에 코드가 있긴 하지만, tracks배열에 i번째에 접근해서 데이터를 가져와 저장하고 이후 필요한 부분인 album 부분만 가져와서 또 파싱 해서 사용했다.

     

    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(str); // API를 통해 넘어온 JSON을 파싱
    JSONArray track = (JSONArray) jsonObject.get("tracks"); // JSON 파싱 데이터에서 tracks부분을 배열로 가져옴
    for (int i = 0; i < track.size(); i++) {
    	JSONObject trackbody = (JSONObject) track.get(i); // 가져온 배열에서 i번째 부분만 가져옴
    	JSONObject albumbody = (JSONObject) trackbody.get("album"); // 위에서 가져온 데이터에서 앨범 부분만 가져와서 저장 여기에 앨범제목
    																// 출시일은 그냥 있고 이미지 아티스트는 배열형태
    	JSONArray image = (JSONArray) albumbody.get("images"); // 이미지 부분을 배열로 가져옴
    	JSONObject imagebody = (JSONObject) image.get(0);
    	JSONArray artist = (JSONArray) albumbody.get("artists"); // 아티스트 부분을 배열로 가져옴
    	JSONObject artistbody = (JSONObject) artist.get(0);
    	MusicDto dto = new MusicDto();
    	dto.setArtist(artistbody.get("name").toString());
    	dto.setTitle(trackbody.get("name").toString());
    	dto.setYear(albumbody.get("release_date").toString());
    	dto.setImgLink(imagebody.get("url").toString());
    	list.add(dto);
    }
    JSONArray seed = (JSONArray) jsonObject.get("seeds");
    JSONObject seedbody = (JSONObject) seed.get(0);
    System.out.println(seedbody.get("id"));

    json-simple 라이브러리를 추가하였으면  JSONParser와 JSONObject를 이용해 먼저 JSON을 파싱 해준다. 이후 JSON의 내용에 맡도록 파싱을 진행하는데 간단히 말하면 오브젝트의 경우 JSONObject를 사용하면 되고 배열의 경우 JSONArray를 이용하면 된다. JSONObject의 경우. get("Key값")을 통해 쉽게 가져올 수 있고, JSONArray는. get(index)를 이용해 가져온 뒤 JSONObject를 이용하면 된다. 위의 이미지와 코드를 비교한다면 쉽게 이해가 갈 것이다.

     

    가공한 데이터는 아래와 같은 형식으로 MusicDto에 담았다.

    [artist=The xx, title=Intro, year=2009-08-16,  imgLink=https://i.scdn.co/image/ab67616d0000b27348a95897fd91eb34032a93e3]

    728x90

    댓글