728x90


volley로 json데이터를 주고받아보도록하자.

설정의 설명은 생략할테니 참고부분을 참고하라.


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

<application
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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

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

manifest설정이다.


액티비티의 모습이다.


서버에서 제공하는 해당 url은 위와 같다.

그럼 해당 json데이터를 받아보도록 하자.


package net.theceres.myapplication;

import android.support.v7.app.AppCompatActivity;
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 com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
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.JsonRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

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

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

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MAIN";
private TextView tv;
private RequestQueue queue;

private String id;
private String pw;
private JSONArray language;
private JSONObject item;

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

queue = Volley.newRequestQueue(this);
String url = "http://192.168.0.9:5000/";

final JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
id = response.getString("id");
pw = response.getString("pw");
language = response.getJSONArray("language");
item = response.getJSONObject("item");
tv.setText(id + ":" + pw + ":" + language + ":" + item);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

jsonRequest.setTag(TAG);
queue.add(jsonRequest);
}

@Override
protected void onStop() {
super.onStop();
if (queue != null) {
queue.cancelAll(TAG);
}
}
}

url은 여러분의 url로 해라.

위와 같이 사용하면 json데이터를 받을 수있다.

여기서 우리는 StringRequest가 아니라 JsonObjectRequest라는 조금 다른 request를 사용하였다.

받는 변수의 타입은 해당 타입과 맞추어준다.

위의 예제에서 json object와 json array를 받는 예제를 볼 수 있다.


보다시피 해당 값을 받을 수 있다.


하지만 해당 솔루션은 문제가 있다.

바로 넘어오는 타입이 Json Array인지, Json Object인지, null인지 알수 없다는 것이다.

즉 보내는 쪽에서 보내는 타입을 신경써야 한다는 소리이다.

사실 이게 크게 문제는 안 될수 있지만 사용하기 조금 껄끄럽다.

이 문제점을 해결하고 싶다면 구글에서 제공하는 gson을 사용하는게 좋다.

gson을 사용하는 예제를 보도록하자.


gson은 mvn레포지터리에 존재한다.


해당 의존성을 복사해서 넣어준다.


dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

// https://mvnrepository.com/artifact/com.android.volley/volley
compile group: 'com.android.volley', name: 'volley', version: '1.0.0'
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
}

이렇게 넣어주면 된다.


package net.theceres.myapplication;

import android.support.v7.app.AppCompatActivity;
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 com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
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.JsonRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

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

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

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MAIN";
private TextView tv;
private RequestQueue queue;

private String id;
private String pw;
private JSONArray language;
private JSONObject item;

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

queue = Volley.newRequestQueue(this);
String url = "http://192.168.0.9:5000/";

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(response);
tv.setText(jsonElement + "\n");
tv.setText(tv.getText() + jsonElement.getClass().getName() + "\n");
tv.setText(tv.getText() + ((JsonObject) jsonElement).get("language").getClass().getName() + "\n");
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

stringRequest.setTag(TAG);
queue.add(stringRequest);
}

@Override
protected void onStop() {
super.onStop();
if (queue != null) {
queue.cancelAll(TAG);
}
}
}


여기서는 json request가 아닌 string request를 사용한다.

row하게 문자열로 받아서 json parser로 json화 시킨다.

gson은 json의 개념을 추상화한 json element가 존재한다.

그리고 jsonElement의 타입을 확인해서 Array면 JsonArray로 사용하고 Object면 JsonObject로 사용한다.

또한 get으로 자식 엘레멘트를 가져올 수 있다.


결과를 확인해보자.

gson이 훨씬 유동적이게 사용할 수 있음을 확인할 수 있다.








+ Recent posts