본문 바로가기
안드로이드/개발자 일상

안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용)

by 차누감 2020. 3. 19.

아래 링크 Gson 라이브러리 주소입니다. 

https://github.com/google/gson

 

google/gson

A Java serialization/deserialization library to convert Java Objects into JSON and back - google/gson

github.com

간략히 설명드리면

Gson 라이브러리는 

 

Java 객체를 Json으로 변환 또는 Json을 Java 객체로 변환하는 데 사용합니다.

 

toJson() 또는 fromJson() 메소드를 이용해서 간단하게 변환합니다.

(이번 예제는 fromJson() 메소드를 이용할 겁니다.)


<실행 화면> - Json으로 받아온 정보를 Gson 라이브러리를 이용하여 Java객체로 받아서 사용하였습니다.


이제 예제를 작성해 봅니다.

 

우선 Gson 라이브러리를 추가합니다.

Gradle:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.6'
}

 

보통 서버에서 Json 형식으로 데이터를 받아오지만, 간단한 예제를 위해 Json파일을 만들겠습니다.

그러기 위해선 app폴더 안에 assets 폴더를 만들고 그 안에 json 파일이 있어야 합니다.

이제 json 파일을 만들겠습니다.

jsonData.json

아래는 보기 좋기 위해 줄 바꿈을 했습니다. (실제 코드는 한 줄로 쭉 쓴 코드)

영화 관련 json 파일은 아래 사이트에서 제공 받을 수 있습니다.

(지금은 간단한 예제이기 때문에 영화 정보를 임의로 짧게 두 개 영화 정보만 있도록 줄였습니다.)

https://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do

 

영화진흥위원회 오픈API

 

www.kobis.or.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{
    "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"
        }]
    }
}
 

우선 한 줄 짜리 json 코드를 위와 같이 보기 좋게 보고 싶다면?

아래 사이트에 한 줄 코드를 복붙 하고 Validate JSON버튼을 눌러주면 된다.

https://jsonlint.com/

 

The JSON Validator

JSONLint is the free online validator and reformatter tool for JSON, a lightweight data-interchange format.

jsonlint.com

 

실제 jsonData.json 내용은 아래 코드와 같다. 줄바꿈이 들어가면 에러가 납니다. (줄 바꿈도 인식하기 때문에..)

jsonData.json

1
{"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"}]}}

 

이제 acitiviy_main.xml을 디자인 해봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <TextView
        android:id="@+id/tv_movie_rank1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="영화 순위1"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.098"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.172" />
 
    <TextView
        android:id="@+id/tv_movie_name1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="영화 제목1"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.675"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.172" />
 
    <TextView
        android:id="@+id/tv_movie_rank2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="영화 순위2"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.098"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.333" />
 
    <TextView
        android:id="@+id/tv_movie_name2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="영화 제목2"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.675"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.333" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="152dp"
        android:onClick="click_btn"
        android:text="JSON File read"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintVertical_bias="0.198" />
 
 

 
 

MainActivity.java를 작성해 봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
 
 
 
 
 
public class MainActivity extends AppCompatActivity {
 
    TextView tvMovieRank1, tvMovieRank2;
    TextView tvMovieName1,tvMovieName2;
 
    String movieName1, movieName2;
    String rank1, rank2;
 
    Gson gson = new Gson();
 
    static String TAG="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tvMovieRank1=findViewById(R.id.tv_movie_rank1);
        tvMovieName1=findViewById(R.id.tv_movie_name1);
 
        tvMovieRank2=findViewById(R.id.tv_movie_rank2);
        tvMovieName2=findViewById(R.id.tv_movie_name2);
 
        try{
 
            InputStream is = getAssets().open("jsonData.json");
            byte[] buffer = new byte[is.available()];
            is.read(buffer);
            is.close();
            String json = new String(buffer, "UTF-8");
 
            JSONObject jsonObject = new JSONObject(json);
            //jsonObject=={"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"}]}}
 
 
            Map<String,Object> boxOfficeResult= gson.fromJson( jsonObject.get("boxOfficeResult").toString(),new TypeToken<Map<String, Object>>(){}.getType());
            //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}]}
 
            ArrayList<Map<String, Object>> jsonList = (ArrayList) boxOfficeResult.get("dailyBoxOfficeList");
            //jsonList==[{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}]
 
            //dailyBoxOfficeList에 있는 값을 자유롭게 사용 가능하다.
            // (0) 첫번째 영화 정보
            movieName1=jsonList.get(0).get("movieNm").toString();
            rank1=jsonList.get(0).get("rank").toString();
            // (1) 첫번째 영화 정보
            movieName2=jsonList.get(1).get("movieNm").toString();
            rank2=jsonList.get(1).get("rank").toString();
 
 
 
        }catch (Exception e){e.printStackTrace();}
    }// onCreate()..
 
    public void click_btn(View view) {  //버튼 클릭
        tvMovieName1.setText(movieName1);
        tvMovieRank1.setText(rank1);
 
        tvMovieName2.setText(movieName2);
        tvMovieRank2.setText(rank2);
    }
}
 
 

<실행 화면> - Json으로 받아온 정보를 Gson 라이브러리를 이용하여 Java객체로 받아서 사용하였습니다.

 

<이해편 - JSONObject List,Map 으로 저장 방법>

2020/03/21 - [안드로이드/개발자 일상] - 안드로이드 JSONObject를 List, Map으로 저장하는 팁

 

안드로이드 JSONObject를 List, Map으로 저장하는 팁

통신 및 JSONObject로 받았는데, 어떻게 데이터를 담을지 잘 이해가 안됩니다. 그래서 쉽게 설명해드리겠습니다. 아래 JSON 형식으로 설명을 드리겠습니다. 보통 dailyBoxOfficeList에서 정보를 사용하겠죠? { "bo..

lcw126.tistory.com

 

 

<응용편 - RecycelerView로 표현>

영화 정보가 ArrayList에 담겼기 때문에, 나중에 RecycelerView로 표현할 때 편할 것입니다.

RecycelerView로 표현은 아래 링크로 가시면 됩니다. (현재 예제 응용 버전)

2020/03/20 - [안드로이드/개발자 일상] - 안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용 + RecyclerView)

 

안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용 + RecyclerView)

2020/03/19 - [안드로이드/개발자 일상] - 안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용) 안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용) 아래 링크 Gson 라이브러리 주소입니다...

lcw126.tistory.com

 

댓글