본문 바로가기

Android/꼭 공부해야 할 라이브러리

[웹에서 데이터 가져오기] 1. JSON

1. 개요

자바스크립트 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷입니다. 웹에서 데이터를 전송할 때 일반적으로 사용합니다.


JSON 포맷의 데이터는 기본적으로 다음과 같이 표현됩니다.

1) 객체는 중괄호 {}로 표기합니다.

2) 배열은 대괄호 []로 표기합니다.

3) 각 변수는 변수 이름과 변수의 값으로 구성되어 있으며, 콜론 : 로 구분합니다.

4) 속성이 여러 개인 경우 쉼표 , 로 구분합니다.

2. 예시

아래 텍스트는 영화진흥위원회의 API 서비스를 사용해 영화 정보를 조회한 결과입니다.
이 데이터를 통해서 설명드리겠습니다.

// 1) TopMovieList
{
    "movieListResult" : 
{ // 2) movieListResult
        "totCnt":2,"source":"영화진흥위원회","movieList" : 
[ // 3) movieList
                 {  // 4) movieListItem
                     "movieCd":"20204117",
                     "movieNm":"모가디슈",
                     "movieNmEn":"Escape from Mogadishu",
                     "prdtYear":"2021","openDt":"20210728",
                     "typeNm":"장편",
                     "prdtStatNm":"개봉",
                     "nationAlt":"한국",
                     "genreAlt":"액션,드라마",
                     "repNationNm":"한국",
                     "repGenreNm":"액션",
                     "directors" : [ 
                         {"peopleNm":"류승완"} // 5) directorsInfo
                     ],
                     "companys" : [ // 6) companysInfo
                         {"companyCd":"20160941","companyNm":"(주)덱스터스튜디오" },
                         {"companyCd":"20100374","companyNm":"(주)외유내강"},
                         {"companyCd":"20186561","companyNm":"(주)필름케이"}
                     ]
                 },
                 { 
                     "movieCd":"20194306",
                     "movieNm":"모가디슈에서 온 소녀",
                     "movieNmEn":"A Girl from Mogadishu ",
                     "prdtYear":"2019","openDt":"",
                     "typeNm":"장편","prdtStatNm":"기타",
                     "nationAlt":"이스라엘,벨기에,기타",
                     "genreAlt":"드라마",
                     "repNationNm":"이스라엘",
                     "repGenreNm":"드라마",
                     "directors" : [],
                     "companys" : []
                 }
        ]
     }
}


1) TopMovieList

모든 정보를 포괄하는 하나의 객체입니다. 이름이 나와있지 않지만, 편의상 TopMovieList라고 표현하겠습니다.

2) movieListResult

TopMovieList 안에 포함된 객체입니다.
각 속성이 콜론 : 으로 구분되기에, 이것도 속성입니다.
이 경우 movieListResult라는 속성 이름과 중괄호 {}로 묶인 객체라는 속성의 값이 있습니다.
이 경우 movieListResult는 중괄호 {}로 묶인 객체의 값을 가지며, 이 경우 "totCnt", "source", "movieList"라는 이름의 속성들(데이터 클래스로 표현하자면 파라미터)를 가집니다.

또한 movieListResult라는 이름의 객체를 TopMovieList가 갖고 있습니다.

3) movieList

대괄호 []로 포함된 배열을 나타내는 변수입니다.
이 예시에서는 총 2개의 값을 가집니다.

4) movieListItem

중괄호 {} 로 묶인 객체는 이름은 따로 지정되어있지 않지만 편의상 movieListItem이라고 설정하겠습니다. 이 변수는 movieCd부터 companys까지의 값을 갖는 변수이며, 총 2개의 movieListItem이 movieList 배열에 있습니다.
movieCd부터 각 변수들은 콜론 : 다음 값을 가집니다.

5) directorsInfo

중괄호 {} 로 묶인 객체의 배열 변수입니다. 이때 이 객체를 편의상 directorsInfo라고 하겠습니다.
이 객체는 내부에 peopleNm이라는 변수를 갖고 있습니다.

6) companysInfo

중괄호 {} 로 묶인 객체의 배열 변수입니다. 이때 이 객체를 편의상 companysInfo라고 하겠습니다.

이 모든 정보들을 안드로이드에서 조회하기 위해서는 각각의 객체에 대응하는 데이터 클래스를 만들어야 합니다.
아래 코드는 그에 해당하는 데이터 클래스들입니다.

[TopMovieList]

    data class TopMovieList(
        val movieListResult: MovieListResult
    )


[MovieListResult]

    data class MovieListResult(
        val totCnt: Int?,
        val source: String?,
        val movieList: ArrayList<MovieListItem>?
    )


[MovieListItem]

    data class MovieListItem(
        val movieCd: String?,
        val movieNm: String?,
        val movieNmEn: String?,
        val prdtYear: String?,
        val openDt: String?,
        val typeNm: String?,
        val prdtStatNm: String?,
        val nationAlt: String?,
        val genreAlt: String?,
        val repNationNm: String?,
        val repGenreNm: String?,
        val directors: ArrayList<DirectorInfo>?,
        val companys: ArrayList<CompanyInfo>?
    )


[DirectorInfo]

    data class DirectorInfo(
        val peopleNm: String?,
        val peopleNmEn: String?
    )


[CompanyInfo]

    data class CompanyInfo(
        val companyNm: String?,
        val companyPartNm: String?
    )


이제 이 데이터 클래스를 사용하면 웹에서 요청한 정보를 적절하게 처리할 수 있습니다.

3. 마무리

이번 시간에는 JSON 객체에 대해서 간단하게 알아보았습니다. 이제 JSON 문자열 객체를 웹에서 요청해서 받으면, 이를 적절히 처리해 원하는 기능을 구현할 수 있습니다.

웹서버에 데이터를 요청하는 것은 Volley 부분에서, 요청받은 데이터를 처리하는 부분은 GSON 부분에서 다루도록 하겠습니다.

 

 

728x90
반응형