JSON 데이터 주고 받기(2)(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();
를 사용해서 알아낼 수 있는데
이와 관련해서 글을 써보도록
하겠습니다
마지막 예제 영상을
하나 올려보면서 마무리
하겠습니다.
'안드로이드(android) > JSON' 카테고리의 다른 글
Json Key값 추출 - keys(), Iterator (5) | 2016.10.15 |
---|---|
JSON 데이터 주고 받기(1)(JSON 파싱) (8) | 2016.10.06 |