본문 바로가기

안드로이드

JSON 데이터 다루기

반응형

Gson 라이브러리는 JSON 문자열을 객체로 변환할 수 있도록 해 준다

 

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

 

Build.gradle(Module)에 Volley와 Gson을 추가하고 Sync now

dependencies {
	...
    implementation 'com.android.volley:volley:1.2.1'
    implementation 'com.google.code.gson:gson:2.8.8'
}

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a58_request_json">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application

        android:usesCleartextTraffic="true"

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.A58_Request_JSON">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="사이트 주소 입력"
        android:inputType="textPersonName" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="요청하기" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="20sp" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

 

 

 

영화 정보 JSON 응답의 포맷에 맞추어 새로운 자바 클래스를 정의해야 한다

변수의 이름은 JSON 문자열에서 속성의 이름과 같아야 하고,

변수의 자료형은 JSON 문자열에서 속성 값의 자료형과 같아야 한다

응답 JSON 문자열의 포맷에 맞게 만들어야한다

 

Movie.java

package com.example.a58_request_json;

public class Movie {

    int id;
    String url;
    String title;
    int year;
    double rating;
    int runtime;
    String[] genres;
    String small_cover_image;

}

 

 

 

 

MovieListResult.java

package com.example.a58_request_json;

import java.util.ArrayList;

public class MovieListResult {

    int movie_count;
    int limit;
    int page_number;
    ArrayList<Movie> movies = new ArrayList<>();
//    JSON 문자열의 속성 중에서 값이 배열인 경우, ArrayList 자료형을 사용할 수 있다

}

 

 

 

 

 

 

MovieList.java

package com.example.a58_request_json;

public class MovieList {
    MovieListResult data;
}

 

 

 

 

 

MainActivity

package com.example.a58_request_json;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

// https://youngest-programming.tistory.com/16

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;

    //    요청 큐는 한번만 만들어 계속 사용할 수 있기 때문에 static으로 선언
//    요청 큐는 이 액티비티에서만 사용하는 것이 아니라 앱 전체에서 사용하는 것이 일반적
//    실제 앱을 만들 때는 별도의 클래스를 하나 만들어서 넣어둘 수 있다
    static RequestQueue requestQueue;

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

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

//        editText.setText("https://yts.am/api/v2/list_movies.json");
        editText.setText("https://yts.am/api/v2/list_movies.json?limit=3");

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                makeRequest();
            }
        });


        if (requestQueue == null) {
//            요청 큐 생성, 메인 액티비티가 메모리에 만들어질때 같이 생성됨
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }
    }

    public void makeRequest() {
        String url = editText.getText().toString();

//        StringRequest는 요청 객체 중 하나이며 가장 많이 쓰임
//        요청 객체는 파라미터로 보내는 방식(GET, POST), URL, 응답 성공 리스너, 응답 실패 리스너
//        4개의 파라미터를 전달할 수 있다
//        화면에 결과를 표시할 때 핸들러를 사용하지 않아도 되는 장점이 있다
        StringRequest request = new StringRequest(
//                com.android.volley.Request
                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);
                    }
                }
        ) {
            //            POST 방식을 사용하면서 요청 파라미터를 전달하고자 한다면 getParams 메소드에서 반환하는 HashMap 객체에 넣어준다
//            이렇게 만든 요청 객체는 요청 큐에 넣어주는 것만 해주면 된다
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();

                return params;
            }
        };

//        requestQueue.add(request); 코드로 요청 큐에 request를 add로 넣어줄 때,
//        Volley가 내부에서 캐싱을 해준다. 한번 보내고 받은 응답 결과가 있으면, 그 다음에 보냈을 때 이전 것이 있으면 이전 것을 보여줄 수도 있다
//       매번 받은 결과를 새로 보여주려면 setShouldCache를 false로 한다
        request.setShouldCache(false);
        requestQueue.add(request);

        println("요청 보냄");
    }

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

    public void processResponse(String response) {
        Gson gson = new Gson();
        MovieList movieList = gson.fromJson(response, MovieList.class);
        println("영화 정보의 수 " + movieList.data.movies.size());
    }
}
반응형

'안드로이드' 카테고리의 다른 글

안드로이드 SQLite  (0) 2021.10.29
영화 정보 가져와 보여주기  (0) 2021.10.28
Volley - HTTP 라이브러리  (0) 2021.10.28
웹으로 요청하기  (0) 2021.10.27
소켓 사용하기  (0) 2021.10.27