JSON
JSON의 약자는 JavaScript Object Notation으로 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한
문자 기반의 표준 포맷이다. 따라서 자바 스크립트 객체 포맷과 거의 동일하다.
웹 어플리케이션에서 데이터를 전송할 때 사용하고,
서버에서 클라이언트로 데이터를 전송하여 표현 하거나 반대의 경우에 사용한다.
Gson은 자바스크립트에서처럼 JSON 문자열을 객체로 변환할 수 있도록 해준다.
즉, JSON 문자열이 자바 객체로 만들어 질 수 있다.
Volley를 사용해서 웹 서버로부터 JSON 응답을 받았다면 Gson을 이용해서 자바 객체로 바꾸고
그 객체 안에 들어있는 데이터를 접근하여 사용할 수 있다.
사용하기
Gson도 Volley처럼 외부 라이브러리이기 때문에 라이브러리를 추가해야 사용할 수 있다.
Gradle Scripts/build.gradle(Moudle: Project Name)
1
2
3
4
5
dependencies {
...
implementation 'com.android.volley:volley:1.2.0'
implementation 'com.google.code.gson:gson:2.8.6'
}
Gson은 JSON 문자열을 자바 객체로 바꿔주는데 자바는 객체를 만들 때 클래스를 먼저 정의하는 과정을
거치므로 JSON 문자열을 자바 객체로 바꿀 때도 클래스를 먼저 정의 해야한다.
영화 정보를 가져온다고 가정하고 영화 정보 JSON 응답의 포맷에 맞추어 새로운 자바 클래스를 정의한다.
MovieList.java
1
2
3
public class MovieList {
MovieListResult boxOfficeResult;
}
위의 변수 하나를 선언 했는데 이 변수의 자료형은 JSON 문자열 속성 값의 자료형과 같아야 하고, 변수 이름은 JSON 문자열에서 속성의 이름이 같아야 한다.
JSON 문자열에서 boxOfficeResult 속성의 값이 객체이므로 이 객체를 변환하여 담아둘 클래스를 선언하는데,
MovieListResult 이름으로 추가한다.
MovieListResult.java
1
2
3
4
5
6
7
8
public class MovieListResult {
String boxofficeType;
String showRange;
ArrayList<Movie> dailyBoxOfficeList = new ArrayList<Movie>();
}
또한, ArrayList 배열 안에 다시 객체가 들어가므로 그를 위한 클래스를 추가로 만들어줘야한다.
Movie.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}
참고로 위 문자열들은 영화 진흥 위원회 오픈 API에 명시되어 있는 응답 구조 변수들이다.
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity{
... 중략
@Override
public void onResponse(String response) {
println("응답 -> " + response);
processResponse(response);
}
... 중략
public void processResponse(String response) {
Gson gson = new Gson();
// JSON 문자열을 MovieList 객체로 변환하기
MovieList movieList = gson.fromJson(response, MovieList.class);
println("영화정보의 수 : " + movieList.boxOfficeResult.dailyBoxOfficeList.size());
}
}
결과