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

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

by 차누감 2020. 3. 21.

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

 

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

아래 링크 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 간략..

lcw126.tistory.com

만약 Gson의 이해가 부족하신 분은 위 예제를 먼저 하시면 좋을 것 같습니다.

이번 예제는 위 예제와 데이터는 거의 비슷하고 RecyclerView를 추가로 이용한 것입니다.

Gson 라이브러리 추가 및 이용 방법은 위 예제를 참고 바랍니다. 여기에서는 간단하게 설명하겠습니다.

(위 예제는 Json을 Java 객체로만 바꿈.)


<실행 화면> Json 파일을 Gson을 이용해 Java객체로 변환했습니다. 그 데이터를 RecyclerView로 보여줍니다.


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

Gradle:

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

assets폴더를 만들고, jsonData.json 파일을 만들어 줍니다.

 

jsonData.json

(영화진흥위원회 오픈 API 일별 박스오스피) 응답 예시 Json 내용

http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20200319

 

만든 jsonData.json에 아래 내용을 복붙합니다.

1
{"boxOfficeResult":{"boxofficeType":"일별 박스오피스","showRange":"20200319~20200319","dailyBoxOfficeList":[{"rnum":"1","rank":"1","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20199842","movieNm":"인비저블맨","openDt":"2020-02-26","salesAmt":"58340180","salesShare":"20.4","salesInten":"-10174200","salesChange":"-14.8","salesAcc":"3936045540","audiCnt":"6953","audiInten":"-1281","audiChange":"-15.6","audiAcc":"451518","scrnCnt":"517","showCnt":"1287"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20192399","movieNm":"1917","openDt":"2020-02-19","salesAmt":"52782440","salesShare":"18.5","salesInten":"7328740","salesChange":"16.1","salesAcc":"5804015500","audiCnt":"6078","audiInten":"583","audiChange":"10.6","audiAcc":"632433","scrnCnt":"460","showCnt":"1030"},{"rnum":"3","rank":"3","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20204791","movieNm":"다크 워터스 ","openDt":"2020-03-11","salesAmt":"34389960","salesShare":"12.1","salesInten":"-12282380","salesChange":"-26.3","salesAcc":"716521920","audiCnt":"4156","audiInten":"-1624","audiChange":"-28.1","audiAcc":"82671","scrnCnt":"460","showCnt":"1019"},{"rnum":"4","rank":"4","rankInten":"62","rankOldAndNew":"OLD","movieCd":"20205096","movieNm":"세인트 아가타 ","openDt":"2020-03-19","salesAmt":"24458940","salesShare":"8.6","salesInten":"24380960","salesChange":"31265.7","salesAcc":"25768920","audiCnt":"2903","audiInten":"2892","audiChange":"26290.9","audiAcc":"3068","scrnCnt":"390","showCnt":"744"},{"rnum":"5","rank":"5","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20193321","movieNm":"정직한 후보","openDt":"2020-02-12","salesAmt":"11783460","salesShare":"4.1","salesInten":"-6137160","salesChange":"-34.2","salesAcc":"12674591150","audiCnt":"2088","audiInten":"-868","audiChange":"-29.4","audiAcc":"1509982","scrnCnt":"257","showCnt":"409"},{"rnum":"6","rank":"6","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20180962","movieNm":"지푸라기라도 잡고 싶은 짐승들","openDt":"2020-02-19","salesAmt":"11868580","salesShare":"4.2","salesInten":"-4470720","salesChange":"-27.4","salesAcc":"5250369610","audiCnt":"1407","audiInten":"-551","audiChange":"-28.1","audiAcc":"605037","scrnCnt":"260","showCnt":"423"},{"rnum":"7","rank":"7","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20192240","movieNm":"작은 아씨들","openDt":"2020-02-12","salesAmt":"10796680","salesShare":"3.8","salesInten":"-4323960","salesChange":"-28.6","salesAcc":"7094634750","audiCnt":"1342","audiInten":"-522","audiChange":"-28","audiAcc":"841564","scrnCnt":"211","showCnt":"309"},{"rnum":"8","rank":"8","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20180523","movieNm":"스타 이즈 본","openDt":"2018-10-09","salesAmt":"6574440","salesShare":"2.3","salesInten":"-2086100","salesChange":"-24.1","salesAcc":"4370019080","audiCnt":"1293","audiInten":"-433","audiChange":"-25.1","audiAcc":"512921","scrnCnt":"185","showCnt":"265"},{"rnum":"9","rank":"9","rankInten":"11","rankOldAndNew":"OLD","movieCd":"20204340","movieNm":"시원찮은 그녀를 위한 육성방법 피날레","openDt":"2020-02-27","salesAmt":"7310640","salesShare":"2.6","salesInten":"4546500","salesChange":"164.5","salesAcc":"114888460","audiCnt":"960","audiInten":"612","audiChange":"175.9","audiAcc":"13456","scrnCnt":"45","showCnt":"60"},{"rnum":"10","rank":"10","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20167542","movieNm":"분노의 질주: 더 익스트림","openDt":"2017-04-12","salesAmt":"8411000","salesShare":"2.9","salesInten":"8411000","salesChange":"100","salesAcc":"29989567348","audiCnt":"842","audiInten":"842","audiChange":"100","audiAcc":"3654080","scrnCnt":"34","showCnt":"120"}]}}

나중에는 Key를 발급 받아서 사용해봅시다.

 

안드로이드 개발자 사이트 리사이클러뷰 사용 방법 링크 참고

https://developer.android.com/guide/topics/ui/layout/recyclerview

 

RecyclerView로 목록 만들기  |  Android 개발자  |  Android Developers

RecyclerView를 사용하여 동적 콘텐츠의 목록과 그리드를 표시합니다.

developer.android.com

Gradle:

dependencies {
        implementation
'com.android.support:recyclerview-v7:28.0.0'
   
}
   

activity_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
<?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">
 
        android:id="@+id/rv_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:orientation="vertical"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="RecyclerView show"
        android:onClick="click_btn"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_editor_absoluteX="111dp" />
 
 
 
 

그리고 데이터를 표현할 xml을 작성합니다.

(json에 정보가 많지만 "rank", "movieNm", "openDt" 3가지만 보여줄 겁니다.

저 이름은 Json file을 보고 작성한 것입니다.)

recyclerview_item.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
<?xml version="1.0" encoding="utf-8"?>
    android:layout_width="match_parent"
    android:layout_height="100dp"
    xmlns:tools="http://schemas.android.com/tools">
    <TextView
        android:id="@+id/tv_rank"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@color/colorPrimary"
        android:textSize="24sp"
        android:textColor="#FFFFFF"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.12"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.506"/>
    <TextView
        android:id="@+id/tv_movieNm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.352"
        app:layout_constraintStart_toEndOf="@+id/tv_rank"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.506"
        tools:text="movieName" />
 
    <TextView
        android:id="@+id/tv_openDt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:textSize="14sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:text="2020-01-01" />
 
 

 

이제 어댑터를 만들겠습니다.

MyAdapter.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
 
 
import androidx.annotation.NonNull;
 
 
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
 
    private ArrayList<Map<String, Object>> items= new ArrayList<Map<String, Object>>();
 
    public MyAdapter(ArrayList<Map<String, Object>> resultList){
        this.items=resultList;
    }
 
    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(itemView);
    }
 
 
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        Map<String, Object> item = items.get(position);
        holder.setItem(item);
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tvRank, tvMovieNm, tvOpenDt;
        public MyViewHolder(View itemView) {
            super(itemView);
            tvRank=itemView.findViewById(R.id.tv_rank);
            tvMovieNm=itemView.findViewById(R.id.tv_movieNm);
            tvOpenDt=itemView.findViewById(R.id.tv_openDt);
 
        }
        public void setItem(Map<String, Object> item){
 
            //"rank", "movieNm", "openDt"은 Json파일에 저장되어 있던 key값
            tvRank.setText(item.get("rank").toString());
            tvMovieNm.setText(item.get("movieNm").toString());
            tvOpenDt.setText(item.get("openDt").toString());
 
        }
    }
}
 
 

이제 MainActivity.java를 작성합니다.

우선 Json 데이터를 Java객체로 변경합니다. (Gson 라이브러리 이용)

그리고 버튼을 누렀을 시 recyclerview에 setAdapter해줍니다.

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
 
 
 
 
 
 
public class MainActivity extends AppCompatActivity {
 
    private RecyclerView recyclerView;
    private RecyclerView.Adapter mAdapter;
 
    Gson gson = new Gson();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        recyclerView=findViewById(R.id.rv_recyclerview);
 
        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);
 
            Map<String,Object> boxOfficeResult= gson.fromJson( jsonObject.get("boxOfficeResult").toString(),new TypeToken<Map<String, Object>>(){}.getType());
 
            ArrayList<Map<String, Object>> jsonList = (ArrayList) boxOfficeResult.get("dailyBoxOfficeList");
 
            mAdapter=new MyAdapter(jsonList);
 
        }catch (Exception e){e.printStackTrace();}
 
    }//onCreate()..
 
    public void click_btn(View view) {
        recyclerView.setAdapter(mAdapter);
    }
}
 
 

<실행 화면> Json 파일을 저장하여 Gson을 이용해 Java객체로 변환했습니다. 그 데이터를 RecyclerView로 보여줍니다.


<응용편 - Retrofit2를 이용하여 RecyclerView로 보여주는 예제 (영화진흥위원회 오픈 API) >

Retrofit통신을 통해서 영화 정보를 가져와서 보여주는 예제를 작성하겠습니다.

2020/03/22 - [안드로이드/개발자 일상] - 안드로이드 Retrofit2+RecyclerView (영화진흥위원회 오픈 API 이용)

 

안드로이드 Retrofit2+RecyclerView (영화진흥위원회 오픈 API 이용)

이번 글에서는 안드로이드 Retrofit의 사용 방법에 대해 간략히 알아보겠습니다. 자세한 사항은 아래 Retrofit에 대한 사용 설명 사이트를 참고 바랍니다. https://square.github.io/retrofit/ Retrofit A type-sa..

lcw126.tistory.com

 

댓글