전체 소스
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;
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) {
}
}
);
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에 담아줌