본문 바로가기

안드로이드/코드

[안드로이드] Json 데이터를 받아서 한번에 객체에 담기 - JsonObjectRequest, JSONObject, Gson

반응형

 

 

 

 

jsonrequest_title

 

 

 

 

 

 

jsonrequest1

 

 

 

 

 

이전 포스팅에서 StringRequest를 이용해서 원하는 회차의 로또 당첨 번호를 조회하는 예제를 만들어봤는데요.

 

이번에는 JsonObjectRequest와 Gson을 이용해서 더 쉽고 짧은 코드만으로 내가 만든 커스텀 클래스에 json데이터를 받아오는 예제를 만들어보겠습니다.

 

코드의 상당 부분이 이전 코드와 비슷하기 때문에 수정, 추가된 부분만 올리도록 하겠습니다.

 

이전 예제와 같이 보시면 더욱 도움이 되실 것 같습니다.

 

이전 예제를 보실 분들은 텍스트를 클릭해주세요.

 

 

 

LottoData.java(커스텀 클래스)

public class LottoData {
    private int drwNo;
    private String totSellamnt; //총 판매액
    private String returnValue; //읽기 성공 여부
    private String drwNoDate; //추첨일자
    private String firstWinamnt; //1등 1명당 당첨 금액
    private String firstPrzwnerCo; //1등 당첨자 수
    private String firstAccumamnt; //1등 총 당첨 금액
    private String drwtNo1; //추첨번호 1
    private String drwtNo2; //추첨번호 2
    private String drwtNo3; //추첨번호 3
    private String drwtNo4; //추첨번호 4
    private String drwtNo5; //추첨번호 5
    private String drwtNo6; //추첨번호 6
    private String bnusNo; //보너스 추첨번호

    public void setDrwNo(int drwNo){
        this.drwNo = drwNo;
    }

    public int getDrwNo(){
        return drwNo;
    }

    public void setTotSellamnt(String totSellamnt) {
        this.totSellamnt = totSellamnt;
    }

    public void setReturnValue(String returnValue) {
        this.returnValue = returnValue;
    }

    public void setDrwNoDate(String drwNoDate) {
        this.drwNoDate = drwNoDate;
    }

    public void setFirstWinamnt(String firstWinamnt) {
        this.firstWinamnt = firstWinamnt;
    }

    public void setFirstPrzwnerCo(String firstPrzwnerCo) {
        this.firstPrzwnerCo = firstPrzwnerCo;
    }

    public void setFirstAccumamnt(String firstAccumamnt) {
        this.firstAccumamnt = firstAccumamnt;
    }

    public void setDrwtNo1(String drwtNo1) {
        this.drwtNo1 = drwtNo1;
    }

    public void setDrwtNo2(String drwtNo2) {
        this.drwtNo2 = drwtNo2;
    }

    public void setDrwtNo3(String drwtNo3) {
        this.drwtNo3 = drwtNo3;
    }

    public void setDrwtNo4(String drwtNo4) {
        this.drwtNo4 = drwtNo4;
    }

    public void setDrwtNo5(String drwtNo5) {
        this.drwtNo5 = drwtNo5;
    }

    public void setDrwtNo6(String drwtNo6) {
        this.drwtNo6 = drwtNo6;
    }

    public void setBnusNo(String bnusNo) {
        this.bnusNo = bnusNo;
    }

    public String getTotSellamnt() { return totSellamnt; }
    public String getReturnValue() { return returnValue; }
    public String getDrwNoDate() { return drwNoDate; }
    public String getFirstWinamnt() { return firstWinamnt; }
    public String getFirstPrzwnerCo() { return firstPrzwnerCo; }
    public String getFirstAccumamnt() { return firstAccumamnt; }
    public String getDrwtNo1() { return drwtNo1; }
    public String getDrwtNo2() { return drwtNo2; }
    public String getDrwtNo3() { return drwtNo3; }
    public String getDrwtNo4() { return drwtNo4; }
    public String getDrwtNo5() { return drwtNo5; }
    public String getDrwtNo6() { return drwtNo6; }
    public String getBnusNo() { return bnusNo; }
}

 

요청해서 받아오는 json데이터의 키값과 커스텀 클래스의 변수명은 동일하게 만들어주셔야 합니다.

 

저는 모든 데이터를 받아오기 위해서 위처럼 모든 변수를 만들어주었는데 원하시는 데이터만 사용하셔도 좋습니다.

 

setter 또한 필요 없으시다면 추가하지 않으셔도 좋습니다. (JSONObject를 LottoData로 바로 변환을 해주기 때문에 setter를 추가하지 않으셔도 정상적으로 작동합니다.)

 

 

 

MainActivity.java

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
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.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import org.json.JSONException;
import org.json.JSONObject;

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

public class MainActivity extends AppCompatActivity {
    TextView tv;
    Button bt;
    EditText et;
    int drwNo;
    RequestQueue requestQueue;
    Gson gson;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findViewById(R.id.tv);
        et = findViewById(R.id.et);
        bt = findViewById(R.id.bt);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                requestLotto();
            }
        });

        gson = new GsonBuilder().create();

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


    }

    public void requestLotto(){
        drwNo = Integer.parseInt(et.getText().toString());
        String url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + drwNo;

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
                url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    //조회 성공시 객체에 담고 텍스트뷰에 텍스트 띄우기
                    if(response.getString("returnValue").equals("success")){
                        //전달 받은 JSONObject를 커스텀 객체에 담습니다.
                        LottoData lottoData = gson.fromJson(response.toString(), LottoData.class);

                        //텍스트뷰에 객체 값을 꺼내서 띄워줍니다.
                        tv.setText(drwNo + "회차 당첨 번호\n" + lottoData.getDrwtNo1() + " / "
                                + lottoData.getDrwtNo2() + " / " + lottoData.getDrwtNo3() + " / "
                                + lottoData.getDrwtNo4() + " / " + lottoData.getDrwtNo5() + " / "
                                + lottoData.getDrwtNo6());
                    }else{
                        //조회 실패시 토스트 띄우기
                        Toast.makeText(MainActivity.this, "조회하신 회차의 정보를 불러올 수 없습니다."
                                , Toast.LENGTH_SHORT).show();
                    }


                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("EL","error =  " + error.toString());
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                return params;
            }
        };


        request.setShouldCache(false);
        requestQueue.add(request);

    }

}

 

 

 

gson = new GsonBuilder().create(); - Gson 클래스를 생성합니다.

 

LottoData lottoData = gson.fromJson(response.toString(), LottoData.class);

-요청을 보내서 받아온 json데이터를 커스텀 클래스로 바로 변환해줍니다.

 

Gson의 fromJson함수를 이용하시면 String형으로 변환된 json데이터를 클래스로 바로 변환하실 수 있습니다.

 

json데이터뿐만 아니라 toJson함수를 이용해서 String형으로 변환된 클래스도 동일하게 클래스로 변환하실 수 있습니다.

 

 

 

반응형