본문 바로가기
SW - 안드로이드

안드로이드스튜디오 스터디 _ 네트워킹 - (웹으로 요청하기) GSON 이해하기

by 상승남 2019. 1. 7.
728x90
반응형

본 글은 네이버 edwith 안드로이드 부스트코스 과정을 듣고학습내용을 반복 및 복습 학습의 장으로서 메모하고자 합니다.
저는 코딩 강의를 들으면서 듣지만 이해가 안되며 들리지 않아금방 졸리게 되어 지속적으로 공부하기가 힘들었습니다.
가장 큰 이유는 강사분이 말씀하시는 언어 및 단어의 해석자체가 안되기 때문이라고 생각하였습니다.
그래서 모든 설명을 일반적인 언어로 변화 하여 알기 쉽게하여저같은 비전공자 및 디자이너가 쉽게 이해할 수 있는 수준의 자료로만드는 것이 목표 입니다.

Gson 사용하기

 

들어가기 전에

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

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

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

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

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

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

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

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

 

학습 목표

  1. Gson이 JSON 문자열을 어떻게 변환하는지 이해해봅시다.
  2. Gson으로 JSON 문자열을 변환하는 과정을 설명해봅시다.

 

 


핵심 단어

 

  • Gson
  • JSON
  • 자바 객체
 
 
API를 사용하기 위해서 각각의 클래스를 생성 해 준다.
 
MovieList.java

//{"boxOfficeResult":
// {"boxofficeType":"일별 박스오피스","showRange":"20120101~20120101",
// "dailyBoxOfficeList":[
// {"rnum":"1","rank":"1","rankInten":"0",
// "rankOldAndNew":"OLD","movieCd":"20112207","movieNm":"미션임파서블:고스트프로토콜","openDt":"2011-12-15","salesAmt":"2776060500","salesShare":"36.3","salesInten":"-415699000","salesChange":"-13","salesAcc":"40541108500","audiCnt":"353274","audiInten":"-60106","audiChange":"-14.5","audiAcc":"5328435","scrnCnt":"697","showCnt":"3223"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20110295","movieNm":"마이 웨이","openDt":"2011-12-21","salesAmt":"1189058500","salesShare":"15.6","salesInten":"-105894500","salesChange":"-8.2","salesAcc":"13002897500","audiCnt":"153501","audiInten":"-16465","audiChange":"-9.7","audiAcc":"1739543","scrnCnt":"588","showCnt":"2321"},{"rnum":"3","rank":"3","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20112621","movieNm":"셜록홈즈 : 그림자 게임","openDt":"2011-12-21","salesAmt":"1176022500","salesShare":"15.4","salesInten":"-210328500","salesChange":"-15.2","salesAcc":"10678327500","audiCnt":"153004","audiInten":"-31283","audiChange":"-17","audiAcc":"1442861","scrnCnt":"360","showCnt":"1832"},{"rnum":"4","rank":"4","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113260","movieNm":"퍼펙트 게임","openDt":"2011-12-21","salesAmt":"644532000","salesShare":"8.4","salesInten":"-75116500","salesChange":"-10.4","salesAcc":"6640940000","audiCnt":"83644","audiInten":"-12225","audiChange":"-12.8","audiAcc":"895416","scrnCnt":"396","showCnt":"1364"},{"rnum":"5","rank":"5","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113271","movieNm":"프렌즈: 몬스터섬의비밀 ","openDt":"2011-12-29","salesAmt":"436753500","salesShare":"5.7","salesInten":"-89051000","salesChange":"-16.9","salesAcc":"1523037000","audiCnt":"55092","audiInten":"-15568","audiChange":"-22","audiAcc":"202909","scrnCnt":"290","showCnt":"838"},{"rnum":"6","rank":"6","rankInten":"1","rankOldAndNew":"OLD","movieCd":"19940256","movieNm":"라이온 킹","openDt":"1994-07-02","salesAmt":"507115500","salesShare":"6.6","salesInten":"-114593500","salesChange":"-18.4","salesAcc":"1841625000","audiCnt":"45750","audiInten":"-11699","audiChange":"-20.4","audiAcc":"171285","scrnCnt":"244","showCnt":"895"},{"rnum":"7","rank":"7","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20113381","movieNm":"오싹한 연애","openDt":"2011-12-01","salesAmt":"344871000","salesShare":"4.5","salesInten":"-107005500","salesChange":"-23.7","salesAcc":"20634684500","audiCnt":"45062","audiInten":"-15926","audiChange":"-26.1","audiAcc":"2823060","scrnCnt":"243","showCnt":"839"},{"rnum":"8","rank":"8","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20112709","movieNm":"극장판 포켓몬스터 베스트 위시「비크티니와 백의 영웅 레시라무」","openDt":"2011-12-22","salesAmt":"167809500","salesShare":"2.2","salesInten":"-45900500","salesChange":"-21.5","salesAcc":"1897120000","audiCnt":"24202","audiInten":"-7756","audiChange":"-24.3","audiAcc":"285959","scrnCnt":"186","showCnt":"348"},{"rnum":"9","rank":"9","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113311","movieNm":"앨빈과 슈퍼밴드3","openDt":"2011-12-15","salesAmt":"137030000","salesShare":"1.8","salesInten":"-35408000","salesChange":"-20.5","salesAcc":"3416675000","audiCnt":"19729","audiInten":"-6461","audiChange":"-24.7","audiAcc":"516289","scrnCnt":"169","showCnt":"359"},{"rnum":"10","rank":"10","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20112708","movieNm":"극장판 포켓몬스터 베스트 위시 「비크티니와 흑의 영웅 제크로무」","openDt":"2011-12-22","salesAmt":"125535500","salesShare":"1.6","salesInten":"-40756000","salesChange":"-24.5","salesAcc":"1595695000","audiCnt":"17817","audiInten":"-6554","audiChange":"-26.9","audiAcc":"235070","scrnCnt":"175","showCnt":"291"}]}}

public class MovieList {


 MovieListResult boxOfficeResult;


 //MovieList라고 하는 클래스는 응답을 객체로 만들었을때의 결과 로 사용해준다.


}
 

 

MovieListResult.java
package org.techtown.myvolley;

import android.graphics.Movie;

import java.util.ArrayList;

public class MovieListResult {


 String boxofficeType;

 String showRage;

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


}
 
Movie.java
package org.techtown.myvolley;

// {"rnum":"1","rank":"1","rankInten":"0",
// "rankOldAndNew":"OLD","movieCd":"20112207","movieNm":"미션임파서블:고스트프로토콜","openDt":"2011-12-15","salesAmt":"2776060500","salesShare":"36.3","salesInten":"-415699000","salesChange":"-13","salesAcc":"40541108500","audiCnt":"353274","audiInten":"-60106","audiChange":"-14.5","audiAcc":"5328435","scrnCnt":"697","showCnt":"3223"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20110295","movieNm":"마이 웨이","openDt":"2011-12-21","salesAmt":"1189058500","salesShare":"15.6","salesInten":"-105894500","salesChange":"-8.2","salesAcc":"13002897500","audiCnt":"153501","audiInten":"-16465","audiChange":"-9.7","audiAcc":"1739543","scrnCnt":"588","showCnt":"2321"},{"rnum":"3","rank":"3","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20112621","movieNm":"셜록홈즈 : 그림자 게임","openDt":"2011-12-21","salesAmt":"1176022500","salesShare":"15.4","salesInten":"-210328500","salesChange":"-15.2","salesAcc":"10678327500","audiCnt":"153004","audiInten":"-31283","audiChange":"-17","audiAcc":"1442861","scrnCnt":"360","showCnt":"1832"},{"rnum":"4","rank":"4","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113260","movieNm":"퍼펙트 게임","openDt":"2011-12-21","salesAmt":"644532000","salesShare":"8.4","salesInten":"-75116500","salesChange":"-10.4","salesAcc":"6640940000","audiCnt":"83644","audiInten":"-12225","audiChange":"-12.8","audiAcc":"895416","scrnCnt":"396","showCnt":"1364"},{"rnum":"5","rank":"5","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113271","movieNm":"프렌즈: 몬스터섬의비밀 ","openDt":"2011-12-29","salesAmt":"436753500","salesShare":"5.7","salesInten":"-89051000","salesChange":"-16.9","salesAcc":"1523037000","audiCnt":"55092","audiInten":"-15568","audiChange":"-22","audiAcc":"202909","scrnCnt":"290","showCnt":"838"},{"rnum":"6","rank":"6","rankInten":"1","rankOldAndNew":"OLD","movieCd":"19940256","movieNm":"라이온 킹","openDt":"1994-07-02","salesAmt":"507115500","salesShare":"6.6","salesInten":"-114593500","salesChange":"-18.4","salesAcc":"1841625000","audiCnt":"45750","audiInten":"-11699","audiChange":"-20.4","audiAcc":"171285","scrnCnt":"244","showCnt":"895"},{"rnum":"7","rank":"7","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20113381","movieNm":"오싹한 연애","openDt":"2011-12-01","salesAmt":"344871000","salesShare":"4.5","salesInten":"-107005500","salesChange":"-23.7","salesAcc":"20634684500","audiCnt":"45062","audiInten":"-15926","audiChange":"-26.1","audiAcc":"2823060","scrnCnt":"243","showCnt":"839"},{"rnum":"8","rank":"8","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20112709","movieNm":"극장판 포켓몬스터 베스트 위시「비크티니와 백의 영웅 레시라무」","openDt":"2011-12-22","salesAmt":"167809500","salesShare":"2.2","salesInten":"-45900500","salesChange":"-21.5","salesAcc":"1897120000","audiCnt":"24202","audiInten":"-7756","audiChange":"-24.3","audiAcc":"285959","scrnCnt":"186","showCnt":"348"},{"rnum":"9","rank":"9","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20113311","movieNm":"앨빈과 슈퍼밴드3","openDt":"2011-12-15","salesAmt":"137030000","salesShare":"1.8","salesInten":"-35408000","salesChange":"-20.5","salesAcc":"3416675000","audiCnt":"19729","audiInten":"-6461","audiChange":"-24.7","audiAcc":"516289","scrnCnt":"169","showCnt":"359"},{"rnum":"10","rank":"10","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20112708","movieNm":"극장판 포켓몬스터 베스트 위시 「비크티니와 흑의 영웅 제크로무」","openDt":"2011-12-22","salesAmt":"125535500","salesShare":"1.6","salesInten":"-40756000","salesChange":"-24.5","salesAcc":"1595695000","audiCnt":"17817","audiInten":"-6554","audiChange":"-26.9","audiAcc":"235070","scrnCnt":"175","showCnt":"291"}]}}


public class Movie {

 //JSON에서 속성의 이름은 자바 객체의 변수명이 된다.
 // 값의 타입을 변수의 타입이 되도록 수정하면
 // Gson에서 일대일로 매핑을 해준다.

 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



}

 

Movie.java

 

에서는 데이터 값을 변수의 타입이 되도록 수정을 하면

Gson에서 일대일로 매핑을 해준다.

"rnum" : "1" 을 -> String rnum; 의 형식으로 변경해준다.
Gson 1:1 매핑이란 Json에 그 속성이 있다면 그대로 자바 객체에다가 값을 알아서 넣어준다.


MainActivity.java

public class MainActivity extends AppCompatActivity {

 TextView textView;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 textView = (TextView) findViewById(R.id.textView);

 Button button = (Button) findViewById(R.id.button);

 button.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {

 sendRequest();

 }
 });


 if (AppHelper.requestQueue == null) {
 AppHelper.requestQueue = Volley.newRequestQueue(getApplicationContext());

 }

 }

 public void sendRequest() {

// String url = "http://www.google.co.kr";

 String url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101 ";

 StringRequest request = new StringRequest(
 Request.Method.GET,
 url,
 new Response.Listener<String>() {
 @Override
 public void onResponse(String response) {
 println("응답 ->" + response);

 processResponse(response);

 }
 },
 new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {

 println("에러 -> " + error.getMessage());

 }
 }
 ) {
 @Override
 protected Map<String, String> getParams() throws AuthFailureError {
 Map<String, String> params = new HashMap<String, String>();

 return params;
 }
 };

 request.setShouldCache(false); //매번 받은 결과를 그대로 보여주기 위한 기능

 AppHelper.requestQueue.add(request);

 println("요청 보냄.");

 }


 public void processResponse(String reponse){
 Gson gson = new Gson();
 MovieList movieList = gson.fromJson(reponse, MovieList.class);

 if(movieList != null){
 int countMovie = movieList.boxOfficeResult.dailyBoxOfficeList.size();
 println("박스오피스 타입 : " + movieList.boxOfficeResult.boxofficeType);
 println("응답반은 영화 갯수 : " + countMovie);
 }
 }


 public void println(String data) {
 textView.append(data + "\n");

 }
}






 

반응형

댓글