티스토리 뷰

안드로이드에서 웹서버로 통신할 때 주로 사용하는 포맷이 JSON이다. 

웹에 접속해서 데이터를 가져오는 방식은 안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리) 을 참고하기 바란다. 

이렇게 가져온 데이터가 JSON 타입일 경우, 안드로이드에서 이를 처리해서 배열에 저장해 보자. 


웹에서 가져온 데이터를 JSONArray로 변환하고, For문을 중첩해서 돌리면서 각 항목의 값을 가져오는 것이다. 

그리고 String[][] 2차원 배열에 가져온 값을 저장하는 형태로 매우 간단하다. 

소스를 한번 살펴보자. 

  1. try {  
  2.     JSONArray jArray = new JSONArray(result);  
  3.   
  4.     String[] jsonName = {"name","age","exam"};  
  5.     String[][] parsedData = new String[jArray.length()][jsonName.length];  
  6.   
  7.     JSONObject json = null;  
  8.     for (int i=0; i < jArray.length(); i++) {  
  9.         json = jArray.getJSONObject(i);  
  10.         if (json != null) {  
  11.             for (int j=0; j < jsonName.length; j++) {  
  12.                 parsedData[i][j] = json.getString(jsonName[j]);  
  13.             }  
  14.         }  
  15.     }  
  16.   
  17.     for (int i=0; i < parsedData.length; i++) {  
  18.         Log.i("mini""name" + i + ":" + parsedData[i][0]);  
  19.         Log.i("mini""age" + i + ":" + parsedData[i][1]);  
  20.         Log.i("mini""exam" + i + ":" + parsedData[i][2]);  
  21.         Log.i("mini""----------------------------------");  
  22.     }  
  23. catch (JSONException e) {  
  24.     e.printStackTrace();  
  25. }  


2번째 줄에서 매개변수로 넘어온 result라는 문자열을 JSONArray 타입으로 변환한다. 

8-15째 줄에서 JSONArray의 값을 읽어와 2차원 String 배열에 저장하고 있다. 


마지막으로 LogCat을 이용해 결과를 확인하기 위해 Log.i() 함수로 저장된 값을 출력한다. 


실제 안드로이드 프로젝트에서 테스트해보려면 

위 소스를 안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리)의 

전체 소스에서 67-68 줄 사이(onPostExecute 메소드)에 넣고 돌려보기 바란다. 


다음과 같은 결과를 얻을 수 있을 것이다. 



참고로 JSON 변환을 하다보면, 다음과 같은 에러메시지를 만날 때가 있다. 

org.json.JSONArray cannot be converted to JSONObject


JSONArray 타입을 JSONObject로 변환할 수 없다는 것으로 두 타입의 차이를 조금 이해할 필요가 있다. 

JSONObject는 {이름:값, 이름:값 ... }로 구성된 하나의 JSON 객체를 나타낸다. 

반면 JSONArray는 [{이름:값, 이름:값 ...}, {이름:값, 이름:값 ...}, {이름:값, 이름:값 ...}, ... ]와 같이 JSONObject가 여러개 중첩되어 있는 것이다. 

이 차이를 안다면 데이터 문자열의 형태에 따라 JSONObject나 JSONArray로 변환함으로써 위와 같은 오류를 만들지는 않을 수 있을 것이다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함