Json Key값 추출 - keys(), Iterator

Posted by ITPangPang
2016. 10. 15. 18:04 안드로이드(android)/JSON


Json Key값 추출

keys(), Iterator



이번에는 값을 받아서 파싱을 해야하는데 Key값을 모를때 

    어떻게 알아낼수 있는지 알아보도록 하겠습니다


ㆍ Key값 추출은 JSONObject안의 갯수가 때마다 일정하지 

   않을때 주로 사용됩니다.



오늘 테스트 해볼

JSON 값입니다


간단하게 메모장으로

써봤습니다.


이런식으로

JSONObject형태로

이루워져있을때


안드로이드쪽에서

서버에 과일의 이름과

가격을 요청합니다


그럼 서버측에서

서버에 저장되어있는

과일의 이름과 가격을

위와 같이 보내줄 수 있습니다.


사과, 바나나, 수박, 복숭아, 딸기

5가지 종류의 과일과 가격이 넘어왔습니다


그런데 서버에 저장되어있는

과일은 실시간으로 어떻게 변할지

모릅니다


이렇게 5천만원짜리

오렌지가 추가될 수도 잇습니다


과일 종류가 5가지에서

6가지로 증가된 것이죠


기존에 해왔던것 처럼

키 값을 알고 있다면

가격을 쉽게 뽑아낼 수 있습니다


그런데 우리가 가지고 있는

고정 key값은 fruit뿐이고

fruit Object안에 있는

Key값과 Value값에 대해서는

아에 정보가 없습니다


이럴때 어떻게 해야 하는지

간단하게 알아보도록

하겠습니다


일단 기본 코드를 작성해보자


이번에는 xml없이

로그로만 찍어서

확인해보도록 하겠습니다


public class MainActivity extends AppCompatActivity
{
String fruitList=
"{" +
"\"fruit\""+":{" +
"\"apple\":\"3000원\"," +
"\"banana\":\"2000원\"," +
"\"watermelon\":\"100원\"," +
"\"peach\":\"500000원\"," +
"\"strawberry\":\"1원\"" +
"}" +
"}";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}
}


일단 테스트해볼

Json 데이터로

위와 적었던 것처럼

과일 5종류의 이름과 가격을

적어주었습니다.


JSON Data -> JSONObject



위의 Json 데이터에는

JSONObject 2개로 구성되어있습니다

중괄호 셋트가 2셋트 잇죠


그리고 우리는 사용하기

편하게 분리를 해야 합니다


중괄호 기준으로 분리해야겠죠

(아 메모장 사진들에 fruit-> "fruit"으로

해야 정확할 것 같군요.. 실수실수..)



코드로 보자면

서버에서 받아온 값을

2가지 JSONObject로 담기 위해서

JSONObject를 생성해보도록 하겠습니다

public class MainActivity extends AppCompatActivity
{
String fruitList=
"{" +
"\"fruit\""+":{" +
"\"apple\":\"3000원\"," +
"\"banana\":\"2000원\"," +
"\"watermelon\":\"100원\"," +
"\"peach\":\"500000원\"," +
"\"strawberry\":\"1원\"" +
"}" +
"}";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
JSONObject jsonObject = new JSONObject(fruitList);
String fruitValue = jsonObject.getString("fruit");
JSONObject fruitObject = new JSONObject(fruitValue);
}
catch (JSONException e)
{
e.printStackTrace();
}

}
}


위와 같이

 jsonObject, fruitObject

2가지 Object를 생성하였습니다


이제 fruitObject

안에 있는 String을

뽑아내기 위해서

키 값을 알아야되는데


키 값의 이름이 어떤게 될 지 모르고

갯수도 예상할 수 없습니다


JSONObject.keys();


우리는 JSONObject.keys();

를 사용해서 키 값을

알아낼 수 있습니다.


그리고 이 추출한 키 값을

관리해주는 놈이 있습니다.


Iterator

그래서 Iterator한테

key값을 모두 맡기고


우리는 필요할때

 Iterator한테

키 값을 달라고 하면 됩니다


이 부분만

코드를 추가해서 보겠습니다

try
{
JSONObject jsonObject = new JSONObject(fruitList);
String fruitValue = jsonObject.getString("fruit");
JSONObject fruitObject = new JSONObject(fruitValue);
Iterator i = fruitObject.keys();
}


Key값을 전부 요청해서 List에 담는다


자 Keys값을 다 뽑아냈으면

이제 Keys의 이름을 List든 배열이든

차곡차곡 담아야 합니다


Iterator에게

반복적으로 키 값 있는거

하나씩 다 내놔!

하면 됩니다


코드로 보면

public class MainActivity extends AppCompatActivity
{
ArrayList<String> fruitKeyList = new ArrayList<>();
String fruitList=
"{" +
"\"fruit\""+":{" +
"\"apple\":\"3000원\"," +
"\"banana\":\"2000원\"," +
"\"watermelon\":\"100원\"," +
"\"peach\":\"500000원\"," +
"\"strawberry\":\"1원\"" +
"}" +
"}";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
JSONObject jsonObject = new JSONObject(fruitList);
String fruitValue = jsonObject.getString("fruit");
JSONObject fruitObject = new JSONObject(fruitValue);
Iterator i = fruitObject.keys();
while(i.hasNext())
{
String b = i.next().toString();
Log.d("ITPangpang",b);
fruitKeyList.add(b);
}

}
catch (JSONException e)
{
e.printStackTrace();
}
}
}


Arraylist를 하나 추가해주고


Iterator의 Next값이 있으면

While문을 게속 돌려줍니다


String b를 임시저장소로 하나 만들어서

실시간으로 값을 Log로 찍어보고

그 값을 하나하나 Arraylist에 담습니다


찍힌 로그값을 보면

우리가 Key값으로 사용할 

과일의 이름이 차례대로

나온 것을 확인 할 수 있습니다.


뽑아낸 Key값으로 다시 Value를 알아내자


자 이제 마무리 단계죠

알아낸 Key값으로 value값을

추출하면 됩니다.


여기서도 리스트에 있는 Key값이

몇개가 될지 모르니 

반복문을 써야겠죠


마무리 

코드 보겠습니다

public class MainActivity extends AppCompatActivity
{
ArrayList<String> fruitKeyList = new ArrayList<>();
ArrayList<String> fruitValueList = new ArrayList<>();
String fruitList=
"{" +
"\"fruit\""+":{" +
"\"apple\":\"3000원\"," +
"\"banana\":\"2000원\"," +
"\"watermelon\":\"100원\"," +
"\"peach\":\"500000원\"," +
"\"strawberry\":\"1원\"" +
"}" +
"}";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
JSONObject jsonObject = new JSONObject(fruitList);
String fruitValue = jsonObject.getString("fruit");
JSONObject fruitObject = new JSONObject(fruitValue);
Iterator i = fruitObject.keys();
while(i.hasNext())
{
String b = i.next().toString();
fruitKeyList.add(b);
}
for(int j = 0; j<fruitKeyList.size();j++)
{
fruitValueList.add(fruitObject.getString(fruitKeyList.get(j)));
Log.d("ITPangpang",(j+1)+"번째 과일이름->"+fruitKeyList.get(j));
Log.d("ITPangpang",(j+1)+"번째 과일가격->"+fruitValueList.get(j));
}

}
catch (JSONException e)
{
e.printStackTrace();
}
}
}


Value값이자

과일가격의 목록을 담기위한

ArrayList를 하나 생성하고


이번에는 For문으로 한번

돌려보자면


Key의 갯수만큼 반복문이

돌아야되므로

fruitKeyList.size();

를 적어주시면 됩니다


그 후에

fruitValueList에 과일가격을

하나하나 차곡차곡 담아줍니다


fruitObject.getString(fruitKeyList.get(j));

키 값의 이름을 가져와서 getString으로

뽑아내면 되겠죠


그 다음 제대로 잘 담겼나

마무리 확인 로그도 찍어봤습니다


찍힌 로그를 확인해보죠

잘 담긴것 같습니다


마지막으로 5천만원짜리

오렌지를 추가해서 한번 더

돌려보면서 마무리 하도록

하겠습니다


5천만원 오렌지 추가


public class MainActivity extends AppCompatActivity
{
ArrayList<String> fruitKeyList = new ArrayList<>();
ArrayList<String> fruitValueList = new ArrayList<>();
String fruitList=
"{" +
"\"fruit\""+":{" +
"\"apple\":\"3000원\"," +
"\"banana\":\"2000원\"," +
"\"watermelon\":\"100원\"," +
"\"peach\":\"500000원\"," +
"\"strawberry\":\"1원\"," +
"\"orange\":\"50000000원\"" +
"}" +
"}";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
JSONObject jsonObject = new JSONObject(fruitList);
String fruitValue = jsonObject.getString("fruit");
JSONObject fruitObject = new JSONObject(fruitValue);
Iterator i = fruitObject.keys();
while(i.hasNext())
{
String b = i.next().toString();
fruitKeyList.add(b);
}
for(int j = 0; j<fruitKeyList.size();j++)
{
fruitValueList.add(fruitObject.getString(fruitKeyList.get(j)));
Log.d("ITPangpang",(j+1)+"번째 과일이름->"+fruitKeyList.get(j));
Log.d("ITPangpang",(j+1)+"번째 과일가격->"+fruitValueList.get(j));
}
}
catch (JSONException e)
{
e.printStackTrace();
}
}
}

끝!