Android_JSON

홍성채·2022년 4월 20일
0

Android

목록 보기
18/27

데이터 전송 형식

  • XML
    1. 태그를 사용하기 때문에 데이터가 많아질수록 부피가 커진다.
    2. Parsing하기 까다롭다.
  • CSV
    1. 용량이 적지만 가독성이 떨어진다.
  • JSON
    1. 속성-값 쌍으로 이루어진 데이터를 전달하기 위한 개방형 표준 포맷

실습하기

  • 영화 박스오피스에서 순위 영화 이름 갖고오기
  • 전체 소스

    package com.example.ex0419;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    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 org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    public class JsonActivity extends AppCompatActivity {
    
        TextView tvJSON;
    
        RequestQueue queue;
        StringRequest request;
    
        @Override
             protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_json);
    
             tvJSON = findViewById(R.id.tvJSON);
    
            queue = Volley.newRequestQueue(JsonActivity.this);
    
            int method = Request.Method.GET;
            String url = "https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20220418";
    
            request = new StringRequest(
                method,
                url,
                new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONObject obj = new JSONObject(response);
                        
                            JSONObject result = obj.getJSONObject("boxOfficeResult");
                            
                            JSONArray jsonArray = result.getJSONArray("dailyBoxOfficeList");
    
                            String data = "";
                            StringBuffer sb = new StringBuffer();
    
                            
                                for(int i=0; i<jsonArray.length(); i++){
                                    JSONObject movie = jsonArray.getJSONObject(i);
    
                                    String rank = movie.getString("rank");
                                    String movieNm = movie.getString("movieNm");
    
                                    sb.append(rank);
                                    sb.append(".");
                                    sb.append(movieNm);
                                    sb.append("\n");
    
                                 }
                            tvJSON.setText(sb.toString());
    
                             } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(JsonActivity.this,
                                    error.toString(),
                                     Toast.LENGTH_SHORT).show();
                        }
                     }
    
             );
    
            queue.add(request);
        }
    }
  • 소스해석

    • 요청과 응답에 대한 객체 선언

       RequestQueue  queue; 
       StringRequest request; 
      • RequestQueue : Request 객체를 서버로 요청 보내는 역할
      • StringRequest : 요청과 응답에 대한 결과를 문자열로 받는 객체
    • StringRequest 객체 생성 및 초기화

      			 request = new StringRequest(
                           Request.Method.GET,
                           URL,
                           new Response.Listener<String>() {
                               @Override
                               public void onResponse(String response) {
                                   
       
                             }
                         }, new Response.ErrorListener() {
                             @Override
                             public void onErrorResponse(VolleyError error) {
                          
                          
                       }
                   }
                 );
      • new StringRequest(데이터전송방식, 요청주소, 응답리스너, 에러리스너)
      • 데이터 전송방식 : GET or POST
      • 요청주소 : 요청할 수조
        ex)http:~ or https:~
      • 응답 리스너 : 서버에서 응답이 왔을 때 실행하는 리스너
    • JOSN 형식으로 변경
      객체로 변경 시 오류가 발생할 수 있으므로 try~catch문을 사용한다.

       try {               
             JSONObject obj = new JSONObject(response); // 1
             JSONObject result = obj.getJSONObject("boxOfficeResult"); //2
             JSONArray jsonArray = result.getJSONArray("dailyBoxOfficeList"); //3
             String data = "";
             StringBuffer sb = new StringBuffer();
      
             for(int i=0; i<jsonArray.length(); i++){
                  JSONObject movie = jsonArray.getJSONObject(i);
                   String rank = movie.getString("rank");
                   String movieNm = movie.getString("movieNm");
      
                    sb.append(rank);
                    sb.append(".");
                    sb.append(movieNm);
                    sb.append("\n");                              
                }
                tvJSON.setText(sb.toString());
      
            } catch (JSONException e) {
                 e.printStackTrace();
               }
             }

      주석

    • 1번 : 문자열데이터 -> JSON 객체로 변환

    • 2번 : JSON객체에서 "boxOfficeResult"로 데이터 접근

    • 3번 : 접근한 데이터(JSONObject)에서 "dailyBoxOfficeList"로 JSONArray 데이터 접근

    • 대량의 텍스트를 처리하기위해 StringBuffer를 사용한다, 배열에 있는 객체를 하나하나를 JSONObject movie에 담아줌

profile
초보 코딩

0개의 댓글