반응형

웹서버로부터 응답을 받았을 때 응답 데이터의 포맷이 JSON이라는 포맷으로 되어 있는 경우가 많습니다.

예전에는 XML인 경우도 있고 다른 포맷으로 된 경우도 있었으나 요즘에는 JSON이 대부분입니다.

그렇다면 이 JSON 포맷은 어떤 형태이길래 이렇게 많이 사용하는 걸까요?

기본적인 JSON 포맷에 대해 이해해봅시다.



JSON

JSON은 자바스크립트 객체 포맷 데이터를 주고받을 때 사용할 수 있도록 만든 것입니다.

따라서 자바스크립트 객체 포맷과 거의 동일합니다.

약간의 차이가 있는데 문자열 형식으로 표현하면서 속성의 이름과 문자열에 큰따옴표를 사용한다는 점이 다릅니다.

자바스크립트 객체는 중괄호({, })를 이용해 만들 수 있습니다.

JSON 포맷에서도 마찬가지죠. 그리고 객체 안에는 여러 개의 속성이 들어갈 수 있습니다.

속성은 속성 이름과 속성 값이 콜론(:)으로 구분됩니다.

즉, 콜론 뒤에 값이 들어갈 수 있는데 문자열이나 숫자와 같은 기본 자료형의 값이 올 수도 있고 객체가 올 수도 있습니다.

만약 객체가 온다면 콜론 뒤에 다시 중괄호가 오게 됩니다.

만약 여러 개의 객체가 들어있는 배열을 넣어두고 싶다면 대괄호([, ])를 사용합니다.

대괄호 안에 중괄호로 감싼 객체들이 콤마로 구분되어 들어가게 됩니다.


JSON 요청해보기

영화진흥위원회에서 제공하는 Open API는 영화진흥위원회의 웹서버로 영화 정보를 요청하고 응답을 받아볼 수 있도록 합니다.

샘플 주소는 다음과 같습니다.

실제 이 웹서버에 요청하려면 개발자 등록을 하고 키 값을 할당 받아야 하지만 이 샘플 주소는 그런 과정 없이 응답 데이터를 확인해볼 수 있습니다.

응답 데이터의 형태는 다음과 같습니다.

응답 데이터는 문자열 형식으로 받게 됩니다.

그리고 JSON 포맷으로 되어 있죠.

응답 데이터는 한 줄로 표시되지만 크롬 브라우저에서 JSONView와 같은 확장프로그램(Extension)을 설치하면 위와 같이 예쁜 모양으로 보여줄 수 있습니다.

응답 데이터는 하나의 객체로 되어 있으며 그 객체 안에 boxOfficeResult라는 속성이 들어가 있습니다.

이 속성의 값은 다시 객체여서 중괄호가 다시 시작됩니다.

그 안에는 boxOfficeType과 showRange 그리고 dailyBoxOfficeList라는 이름의 속성이 들어가 있습니다.

그 중에 dailyBoxOfficeList 속성의 값은 배열이라 대괄호로 된 값이 들어가 있습니다.

그 배열 안에 들어가 있는 각각의 객체가 하나의 영화 정보입니다.

어떤 포맷인지 이해하는 것이 어렵지 않죠?

 


JSON으로 받은 응답 데이터는 문자열로 되어 있으므로 그 응답 데이터 중에서 특정 속성의 값을 찾아내려면 문자열 처리를 해주어야 합니다.

어떤 객체 안에 들어있는 속성을 찾아내기 위해 중괄호나 콜론, 콤마 등을 이용해야 하는 거죠.

따라서 indexOf나 substring과 같은 메소드들이 사용되고 아주 복잡하고 많은 양의 코드가 만들어지게 됩니다.

그런데 자바스크립트에서는 JSON 문자열을 자바스크립트 객체로 만드는 것이 메소드 호출 하나로 끝납니다.

자바스크립트의 객체 포맷과 JSON 기본 구조가 같고 둘 간에 쉽게 변환할 수 있도록 미리 만들어두었기 때문입니다.

자바에서도 이렇게 할 수는 없을까요?

Gson을 사용하면 한 줄의 코드만으로도 JSON 문자열을 자바 객체로 바꾸어줄 수 있습니다.

Gson을 어떻게 사용하는지 알아보고 Gson을 이용하여 JSON 데이터를 java객체로 변환해 봅시다.



Gson

Gson은 JSON 문자열을 객체로 변환해 주는 라이브러리입니다.

즉, JSON 문자열이 자바 객체로 만들어질 수 있습니다.

Volley를 이용해 웹서버로부터 JSON 응답을 받았다면 Gson을 이용해 자바 객체로 바꾸고 그 객체 안에 들어있는 데이터를 사용하게 됩니다.

Gson은 외부라이브러리이어서 build.gradle(Module: app) 파일을 열고 dependencies의 중괄호 안에 다음 코드를 추가해야 사용할 수 있습니다.

implementation 'com.google.code.gson:gson:2.8.2'

자바스크립트는 객체의 포맷이 객체 안에 속성들이 들어가 있는 구조를 가지고 있지만 자바의 객체는 그런 구조가 아니라서 JSON 문자열을 자바 객체로 변환하기 위해서는 먼저 자바 클래스를 정의해야 합니다.

자바 클래스는 일종의 붕어빵 틀이고 이 틀에서 각각의 붕어빵을 만들어낼 수 있기 때문에 JSON 문자열에 들어있는 속성들에 맞추어 붕어빵 틀을 먼저 정의해야 자동 변환이 가능합니다.

 

JSON 문자열의 속성에 맞는 자바 클래스 정의

영화진흥위원회에서 제공하는 영화 정보 JSON에 맞추어 자바 객체를 만들고 싶다면 먼저 자바 클래스를 정의합니다.

public class MovieList {
    MovieListResult boxOfficeResult;
}

응답 데이터의 가장 바깥이 중괄호이므로 이 객체를 변환할 클래스로 MovieList라는 이름의 클래스를 정의합니다.

이 클래스 안에는 boxOfficeResult라는 이름의 변수를 추가합니다.

여기에서 변수의 이름은 JSON 문자열에서 속성의 이름과 같습니다.

그리고 변수의 자료형은 JSON 문자열에서 속성값의 자료형과 같습니다.

JSON 문자열에서 boxOfficeResult 속성의 값이 다시 객체이므로 이 객체를 변환하여 담을 클래스를 MovieListResult라는 이름으로 만들고 boxOfficeResult 속성의 자료형으로 지정합니다.

public class MovieListResult {
    String boxofficeType;
    String showRange;
    ArrayList<Movie> dailyBoxOfficeList = new ArrayList<Movie>();
}

 

JSON 문자열에서 배열의 표현

JSON 문자열의 속성 중에서 값이 배열인 경우, 즉 대괄호로 표시된 경우에는 자바 클래스를 정의할 때 ArrayList 자료형을 사용할 수 있습니다.

그리고 그 배열 안에 다시 객체들이 들어가는 경우 해당 객체들을 위한 자바 클래스를 또 만들어야 합니다.

이 클래스는 ArrayList의 제네릭 타입으로 지정됩니다.

ArrayList<Movie> dailyBoxOfficeList = new ArrayList<Movie>();

여기에서 배열 안에 들어가는 Movie 객체는 다음과 같이 영화 정보를 담을 변수들을 포함하게 됩니다.

public class Movie {
    String rnum;
    String rank;
    String rankInten;
    String rankOldAndNew;
    String movieCd;
    String movieNm;
    String openDt;
    String salesAmt;
    String salesShare;
    String salesInten;
    String salesChange;
    String salesAcc;
    String audiCnt;
    String audiInten;
    String audiChange;
    String audiAcc;
    String scrnCnt;
    String showCnt
}

 

Gson으로 변환하기

자바 클래스를 정의했다면 Gson을 이용해 변환할 수 있습니다.

Gson gson = new Gson();
MovieList movieList = gson.fromJson(response, MovieList.class);

자바 객체로 변환되었으니 필요한 변수들의 값을 확인하기가 아주 쉬워졌죠?

 



반응형

'안드로이드 개발 > 부스트코스(안드로이드 프로그래밍)' 카테고리의 다른 글

데이터베이스와 SQL  (0) 2019.03.20
이미지 다운로드  (0) 2019.03.19
volley  (0) 2019.03.19
웹으로 요청하기  (0) 2019.03.18
HTTP 이해하기  (0) 2019.03.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기