JSON 데이터 주고 받기(2)(JSON 파싱)

Posted by ITPangPang
2016. 10. 8. 17:14 안드로이드(android)/JSON


JSON 데이터 주고 받기(2)

(JSON 파싱)



이번글에서는 서버에서 데이터가 넘어왔을때

   Json형태로 넘어왔겠죠? 그때 그 값을 변환해서

   String으로 저장하는 방법을 알아보도록 하겠습니다


ㆍ JSONObject와 JSONArray를 구분한 후에 Key값으로

    Value값을 얻어오면 됩니다.


 

JSONObject 파싱


먼저 제일 기본형태인

JSONObject로 감싸져 있는

데이터를 변환시켜보겠습니다.


이전글에서 사용한 코드를

재활용 해서 해보겠습니다.



몸풀이 할겸 처음에는

만들었던 것을 토대로

해보겠습니다.


위와 같이

{"userid":"itpangpang","password":"1234"}

같이 JSONObject로 감싸여있는

데이터를 파싱해서


아이디

itpangpang


패스워드

1234


이 2가지를 뽑아보도록 하겠습니다


xml, java 코드를

살짝 변경하겠습니다

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

<EditText
android:id="@+id/et_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="ID 입력해보거라"/>
<EditText
android:id="@+id/et_pw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="패스워드 입력해보거라"/>
<Button
android:id="@+id/btn_to_server"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Json으로 변환 후 서버에 보내기"/>
<TextView
android:id="@+id/tv_json"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="변환 결과값" />
<Button
android:id="@+id/btn_to_client"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="서버에서 받아온 Json 파싱"/>
<TextView
android:id="@+id/tv_parsing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="변환 결과값" />
</LinearLayout>


위와 같이 적어주면

아래와 같은 화면이

완성됩니다


EditText에서

값을 적어준후에

JSON 변환 후 서버에 보내기

눌러주면


JSON형태로 변환후에

아래 TextView에 찍히고


두번째 버튼인 

서버에서 받아온 JSON파싱

누르면

그 아래 TextView에 파싱한 결과를

보여주도록 하겠습니다


Java코드를 먼저 보겠습니다

public class MainActivity extends AppCompatActivity
{

EditText et_id;
EditText et_pw;
Button btn_to_server;
Button btn_to_client;
TextView tv_json;
TextView tv_parsing;

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

et_id = (EditText)findViewById(R.id.et_id);
et_pw = (EditText)findViewById(R.id.et_pw);
btn_to_server = (Button)findViewById(R.id.btn_to_server);
btn_to_client = (Button)findViewById(R.id.btn_to_client);
tv_json = (TextView)findViewById(R.id.tv_json);
tv_parsing = (TextView)findViewById(R.id.tv_parsing);
btn_to_server.setOnClickListener(myClickListener);
btn_to_client.setOnClickListener(myClickListener);
}

View.OnClickListener myClickListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_to_server :
String temp = "{\"userid\""+":"+"\""+et_id.getText().toString()+"\""+ ","
+ "\"password\""+":" + "\"" + et_pw.getText().toString() + "\"" + "}";
tv_json.setText(temp);
break;

case R.id.btn_to_client :
try
{
JSONObject jsonObject = new JSONObject(tv_json.getText().toString());
String resultId = jsonObject.getString("userid");
String resultPassword = jsonObject.getString("password");
tv_parsing.setText(resultId+"\n"+resultPassword);
}
catch (JSONException e)
{
e.printStackTrace();
}

break;
}
}
};
}


위와 같은 코드입니다

다른 부분은 지난시간에

봤던 그대로이고


파싱하는 부분은

case R.id.btn_to_client :
try
{
JSONObject jsonObject = new JSONObject(tv_json.getText().toString());
String resultId = jsonObject.getString("userid");
String resultPassword = jsonObject.getString("password");
tv_parsing.setText(resultId+"\n"+resultPassword);
}
catch (JSONException e)
{
e.printStackTrace();
}

break;


여기만 보시면 됩니다


첫번째

버튼을 누르면

(case R.id.btn_to_client)


두번째

JSONObect에 JSON형태로 

TextView에 찍혀있는 값을 저장한다

(JSONObject jsonObject = new JSONObject(tv_json.getText().toString());)


세번째

key값으로 value값을 뽑아낸다

우리는 id 키값인 "userid"

password 키값인 "password"

알고 있으므로

매번 변경되는 value값만 구하면 된다

(

String resultId = jsonObject.getString("userid");

String resultPassword = jsonObject.getString("password");

)


네번째

뽑아낸 value값을 TextView에

찍어준다

(tv_parsing.setText(resultId+"\n"+resultPassword);)


결과를 보면


잘 나온것을

확인했습니다.


그냥 위에서는 예를드느라

id, password라 한것이고


실제로는

우리가 서버에 값을 요구할때


안드로이드에서

이 유저의 레벨이 몇이야?(요청)

응답 : {"Level":"15"}


이 유저의 마지막 접속시간과 포인트를 보여줘(요청)

응답 : {"time":"2016-10-08","potin":"586point"}


이 유저가 대답한 3가지 답을 알려줘(요청)

응답 : {"answer_a":"서울","answer_b":"20살","answer_c":"이메일"}


이렇게 get형식으로 받아온

JSONObejct 데이터를

위와 같이


JSONObeject에 저장한 후에

key값을 통하여 접근하여 value값을

추출해주시면 됩니다



JSONArray, JSONObject 파싱


자 이번에는

JSONArray + JSONObject

로 감싸여진 

데이터를 파싱해보도록 하겠습니다


테스트 코드는 역시나

이전글에서 사용했던 코드를

재활용 해보겠습니다



[{"name":"minsu","gender":"male"}, {"name":"sujin","gender":"female"}]


이런 형태의 JSON값을 파싱해보도록 하겠습니다

서버에서 Array 형태로 보낼때는

보통 몇개의 값이 넘어올지 모를때

Array를 많이 사용하게 됩니다


위의 값은 민수, 수진 2명의 정보입니다


안드로이드 측에서

서버에 요청할때

모든 회원들의 성별에 대한 정보를 보여줘!!

라고 요청했을때


위와 같이 2명일 수도 있고

10명일 수도 있고

1000명일 수도 있습니다.


파싱하는 방법은

바로 코드를 보면서

알아보도록 하겠습니다


자바코드만 보겠습니다

public class MainActivity extends AppCompatActivity
{

EditText et_name;
EditText et_gender;
Button btn_to_server;
Button btn_to_client;
TextView tv_json;
TextView tv_parsing;
StringBuffer sb = new StringBuffer();
ArrayList<String> nameList = new ArrayList<>();
ArrayList<String> genderList = new ArrayList<>();

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

et_name = (EditText)findViewById(R.id.et_name);
et_gender = (EditText)findViewById(R.id.et_gender);
btn_to_server = (Button)findViewById(R.id.btn_to_server);
btn_to_client = (Button)findViewById(R.id.btn_to_client);
tv_json = (TextView)findViewById(R.id.tv_json);
tv_parsing = (TextView)findViewById(R.id.tv_parsing);
btn_to_server.setOnClickListener(myClickListener);
btn_to_client.setOnClickListener(myClickListener);
}

View.OnClickListener myClickListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_to_server :
String startJson = "[";
String endJson ="]";

if(!sb.toString().equals(""))
{
sb.append(",");
}
String temp = "{\"name\""+":"+"\""+et_name.getText().toString()+"\""+ ","
+ "\"gender\""+":" + "\"" + et_gender.getText().toString() + "\"" + "}";
sb.append(temp);
tv_json.setText(startJson+sb+endJson);
break;

case R.id.btn_to_client :
try
{
JSONArray jsonArray = new JSONArray(tv_json.getText().toString());
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
nameList.add(jsonObject.getString("name"));
genderList.add(jsonObject.getString("gender"));
}
tv_parsing.setText(""+nameList+"\n"+""+genderList);
}
catch (JSONException e)
{
e.printStackTrace();
}

break;
}
}
};
}


제가 네이밍이 좀 약해서

코드 퀄리티가 좀 낮을수도있지만

ㅠㅠ 어쨋든 코드를 보자면


다른 부분은 역시

이전과 같으니 2번째 버튼

눌렀을때 파싱부분만 보자면

case R.id.btn_to_client :
try
{
JSONArray jsonArray = new JSONArray(tv_json.getText().toString());
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
nameList.add(jsonObject.getString("name"));
genderList.add(jsonObject.getString("gender"));
}
tv_parsing.setText(""+nameList+"\n"+""+genderList);
}
catch (JSONException e)
{
e.printStackTrace();
}

break;


이 부분이죠


[{"name":"minsu","gender":"male"}, {"name":"sujin","gender":"female"}]

위에 껄로 어떻게 변환되나 하나씩 보자면


첫번째

데이터의 가장 바깥이

[] 대괄호로 이루어져 있으므로

이 전체를 담기 위해

JSONArray 객체에 값을 담아줍니다

(JSONArray jsonArray = new JSONArray(tv_json.getText().toString());)



두번째

여기서는 JSONObject를 담아야야 되는데

안에 JSONObject가 몇개 올지 모릅니다

그래서 반복문이 필요하죠


{"name":"minsu","gender":"male"}

한개일 수도 있고


{"name":"minsu","gender":"male"}, {"name":"sujin","gender":"female"}

두개일 수도 있고


{"name":"minsu","gender":"male"}, {"name":"sujin","gender":"female"},{},{},{},{} ..

몇개가 올지 모릅니다


그래서 반복문에서 그 갯수를 구해주기 위해

JSONArray의 길이를 세줍니다

(for (int i = 0; i < jsonArray.length(); i++))


그 다음 JSONArray에서 JSONObject를 추출해야겠죠?

( JSONObject jsonObject = jsonArray.getJSONObject(i);)



추출이 완료되면 Key값으로 접근해서 Value값을 구한후

List에 그 값을 차곡차곡 담아줍니다

(

 nameList.add(jsonObject.getString("name"));

genderList.add(jsonObject.getString("gender"));

)


자 그럼 위에 add작업이

JSONArray길이만큼

반복됩니다.


이제 반복문이 완료되면

TextView에 찍어보면서

결과를 확인하면 됩니다.


일단 위의 결과값을 보도록 하겠습니다


잘 나온것 같죠?

[minsu, sujin]

[male, female]


각 리스트(0) = minsu, male

리스트(1) = sujin, female


이런식으로 뽑아내서 원하는곳에

뿌려주면 되겠죠?


자 여기까지

이전글과 이번글에서

JSON 데이터 주고받는

(기본)!

에 대해 알아봤습니다


기본이라고 하지만

사실 좀 더 복잡해진다고해도

다 여기서 좀 더 활용해서

사용하는 거라서

계속계속 많이 연습하고

코딩을 자주자주 하다보면

익숙해지는 부분입니다.


JSON 주고받는 부분은

여기서 끝내도록 하고


이건 쓰다보니 생각난건데

다음글에서는


Key값을 모를때

JSONObeject.getKeys();

를 사용해서 알아낼 수 있는데

이와 관련해서 글을 써보도록

하겠습니다


마지막 예제 영상을

하나 올려보면서 마무리

하겠습니다.