http://mailmail.tistory.com/11



안녕하세요 PEACE-에요.

안드로이드 스터디 [아홉 번째] 글이네요.


오늘은 Android와 JAVA에서 JSONObject를 다루는 방법에 대해 포스팅하겠습니다. JSONObject는 데이터를 주고 받을때 유용하며 데이터에 대한 정보가 String형태로 이동될 때도 유용하게 사용할 수 있습니다. 필자는 안드로이드와 웹, DB간의 통신을 하기 위해 주고 받는 데이터를 JSON 객체를 통해 주고받으며 좀 더 일관성있고 기능적이게 데이터를 다루었습니다.




1. 데이터 처리


안드로이드에서는 SQLite라고 불리는 내부 DB를 통해 데이터를 저장하고 불러온다. 하지만 실시간으로 변하는 데이터나 다른 사용자의 데이터를 불러오기 위해서는 서버를 통한 DB통신이 필요하다. 이와 같은 상황에선 SQLite만으로 해결할 수 없고 외부 DB를 사용해야한다. 주로 MySQL에나 Oracle를 사용하며, 보통 한 번에 불러오는 데이터는 여러 개(또는 대량)이다. 이와 같은 경우엔 데이터가 저장되는 형식이 있어야 데이터를 다루기 쉬울 것이다. 데이터의 이동은 'DB -> Web(Servlet) -> Android' 과정을 거치는데 쿼리를 통해 DB에서 select한 데이터를 웹에 출력하고 출력물을 안드로이드에서 파싱해오는 형태이다. 이와 같이 DB에서 데이터를 불러올때 여러가지 고려 사항이 있다. 예를들면 내가 만든 DB의 특정 테이블에서 하나의 튜플에 대한 내용을 출력하려한다. 그렇다면 어떻게 할 수 있을까? 테이블은 학생 정보를 담고있고 속성은 학번과 이름학과로 구성되어있다고 가정하자. 내 학번을 입력했을때 나오는 정보는 학번, 이름, 학과가 출력되어야 한다. 그렇다면 우리는 이 데이터는 곧바로 setText()를 통해 보여주거나 int, String과 같은 자료형 변수에 저장했다가 출력할 수도있다. 하지만 한 학과에 대한 모든 학생의 학번, 이름, 학과를 리스트 같은 뷰에서 보여주려면 어떻게 해야할까? 방법은 어떻게든 찾을 수 있다. 다만 그 방법이 좀 더 보기 좋고 이해하기 쉬우며 편리해야 할 필요가 있다고 전하고싶다. 그래서 필자는 JSONObject를 사용하며, 'Android <-> Web(Servlet)'과 같은 통신에서 데이터를 주고 받을때 팀원과의 프로그래밍적인 의사소통이 원활하게 이뤄질수 있다고 생각한다.




2. JSONObject + JSONArray

JSONObject를 공부하자했는데 갑자기 웬 JSONArray지? 하는 분들이 계실거라 생각한다. JSONArray는 JSONObject를 통해 데이터를 입출력하는데 사용되는 보조적인 역할을 한다고 생각하면 된다.


[그림 1] JSON의 데이터 저장 방법

[그림 1]에서 JSONArray를 보자. JSONArray는 JSONObject를 담는 Array라는걸 알 수 있다. 그리고 JSONObect를 보자. JSONObject는 'put(..생략..)' 메서드를 통해 key-value형식(1)의 데이터를 저장할 수 있으며,  key-JSONArray형식(2)으로도 저장 할 수도 있다. 형식(1)과 형식(2)에 대한 결과물은 아래와 같다.

  #형식(1) 'key-value'

    {"학번":"2011","이름":"진성","학과":"정보통신"}


  #형식(2) 'key-JSONArray'

    {"dataSet":[{"학번":"2011","이름":"진성","학과":"정보통신"},{"학번":"2012","이름":"철수","학과":"정보통신"}]}


이제 형식(2)를 통해 대량의 데이터를 처리해보자.





3. 웹(서블릿)에서 JSONObject에 데이터 저장하기


아래 소스코드는 웹(서블릿)에서 데이터를 출력하기 위한 사전 작업으로, JSONObject에 데이터를 넣는 과정의 일부이다. result.next()코드는 본 포스팅에서 다루지 않은 내용이므로 무시해도 된다. JSONObject의 사용법만 익히자.

/**
* 데이터를 저장하는 자바코드
* */
JSONObject jsonMain = new JSONObject();
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject;
while(result.next()){ //result는 db쿼리 실행 결과를 받은 ResultSet 변수이고 .next()를 통해 데이터 커서이동.
jsonObject.clear();

jsonObject.put("학번", result.getString("학번"));
jsonObject.put("이름", result.getString("이름"));
jsonObject.put("학과", result.getString("학과"));


jsonArray.add(jsonObject);
}
jsonMain.put("dataSet", jsonArray);

/**
* jsonMain의 출력 결과 'result' :
* {"dataSet":[{"학번":"2011","이름":"진성","학과":"정보통신"},{"학번":"2012","이름":"철수","학과":"정보통신"}]}
* */





4. JSONObject 데이터를 안드로이드에서 사용하기


우선 String형의 result에 담긴 JSON String을 JSONObject 생성자의 인자로 넣어 새 JSONObject를 만든다. 즉, 웹에서 만든 key-JSONArray형태를 안드로이드에서 복구하는 것이다. 또한 JSONArray에는 학번이 2011과 2012인 두 학생에 대한 각각 JSONObject가 들어있으므로 JSONArray를 통해 각 JSONObject를 호출하고 데이터를 얻어낸다. 소스코드는 아래와 같다.
/**
* 웹에서 출력된 jsonMain을 String result 변수에 저장했다.
* jsonMain -> {"dataSet":[{"학번":"2011","이름":"진성","학과":"정보통신"},{"학번":"2012","이름":"철수","학과":"정보통신"}]}
* */
JSONObject jsonObject = new JSONObject(result); //result를 인자로 넣어 jsonObject를 생성한다.

JSONArray jsonArray = jsonObject.getJSONArray("dataSet"); //"dataSet"의 jsonObject들을 배열로 저장한다.


ArrayList<String> list = new ArrayList<String>();

for(int i=0; i<jsonArray.length(); i++) { //jsonObject에 담긴 두 개의 jsonObject를 jsonArray를 통해 하나씩 호출한다.
jsonObject = jsonArray.getJSONObject(i);
list.add(jsonObject.getInt("학번") +" "+ jsonObject.getString("이름") +" "+ jsonObject.getString("학과"));
}
list에는 두 학생에 대한 String데이터 2개가 들어갔다. 출력 결과는 아래와 같다.

  list.get(0) -> "2011 진성 정보통신"

  list.get(1) -> "2012 철수 정보통신"