Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

[학습자료] 안드로이드에서 JSON 처리 방법 본문

안드로이드/Parser

[학습자료] 안드로이드에서 JSON 처리 방법

설.현.아빠 2011. 2. 11. 11:03



안녕하세요~ 매번 눈팅만하고 필요한 자료만 찾는 도중에 

JSON 에 관련된 글이 없어서 간단하게나마 올려봅니다~. 

이미 알고 계신분들도 많겠지만 저처럼 완전 초보는 이글을 읽고 조금이나마 도움이 됐으면 하는 바람입니다.. 

우선 json에 대한 기초도 없었던 저는 이번 프로젝트로 인해서 고생좀 했습니다 ㅜㅜ 

간단하게 json 에대해 설명하자면 xml 의 무거움을 또 가독성(?)을 개선하고자 txt 파일로 만들어져있고 

key 값과 value 값으로 구분이 됩니다...(제가 어렴풋이 이해한 개념이니.. 안맞더라도 양해를..) 

예를 들어 home.json 이란 파일이 존재하고 이 내용을 보게 되면 


     "title":"TEST", 
     "title_img":"title.png", 
      "buttons":[ 
           { 
                 "id":"home01", 
                 "title":"테스트버튼", 
                 "icon_img":"test_btn.png", 
                 "text_img":"text_img.png" 
           }, 
           { 
                 "id":"home02", 
                 "title":"테스트버튼2", 
                 "icon_img":"test_btn2.png", 
                 "text_img":"text_img2.png" 
           } 
       ] 


각줄의 첫번째 "" 안의 값은 key 값이 되며, 두번째 값은 value가 됩니다. 

"buttons"의 경우 [ ] 로 묶여있는데 이것이 배열을 의마하게 됩니다. 

위의 경우 {} 두번 반복되는 것은 배열buttons[ ]의 0번째 1번째가 되는거겠지요 ^^;; 

배열안의 값도 key값과 value 값으로 구분되어 집니다... 

간단? 하게나마 json파일 형식에 대해 말씀드린거구요(다시 말씀드리지만 저처럼 완전 초보님들에게만....) 

자 이제 위와 같은 json 파일을 안드로이드 프로젝트에서 사용하고자 합니다. 

안드로이드 api 에서 제공하는 json 의 사용은 한계점이 있습니다. json의 사용법은 관련 자료를 찾아보세요. 
(지금 제가 하는 프로젝트는 위와 같이 json 파일로 받아서 각 화면의 이미지, 타이틀, list, url 등의 정보를 받아서 처리하도록 되어있습니다.) 

처음에 별별자료를 다 읽어봤지만 안드로이드에서 사용하는 예제가 영문으로 되어있어서 대략난감했습니다... 
한글로 된 블로그도 있었지만 제수준에서는 이해하기가;;; 

우선 프로젝트의 assets 폴더 안에 json폴더를 생성해주었고 그안에 위와 같은 home.json 파일을 만들어주었습니다. 

Home.java 라는 클래스를 생성해주고 json 파일을 읽어 오는 방법은 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
         
        //asset 폴더의 내용을 가져오기  
        AssetManager assetManager = getResources().getAssets(); 
         
      try{ 
        //사용하고자 하는 json 파일 open 
        AssetInputStream ais = (AssetInputStream)assetManager.open("json/home.json"); 
  
        //stream을 리더로 읽기 
        BufferedReader br = new BufferedReader(new InputStream(ais)); 

        //StringBuilder 사용 
        StringBuilder sb = new StringBuilder(); 

        //json파일의 내용이 용량이 클경우 Stirng 의 허용점인 4096 byte 를 넘어가면 오류발생 
        int bufferSize = 1024 * 1024; 
         
        //char 로 버프 싸이즈 만큼 담기위해 선언 
        char readBuf [] = new char[bufferSize]; 
        int resultSize = 0; 
         
        //파일의 전체 내용 읽어오기 
        while((resultSize = br.read(readBuf))  != -1){ 
                if(resultSize == bufferSize){ 
                       sb.append(readBuf); 
                }else{ 
                       for(int i = 0; i < resultSize; i++){ 
                            //StringBuilder 에 append 
                            sb.append(readBuf[i]); 
                       } 
                } 
        } 
        // 수정 - 새로운 문자열을 만들어서 내부 버퍼의 내용을 복사하고 반환한다.
        String jString = sb.toString();

        //JSONObject 얻어 오기 
        JSONObject  jsonObject =  new JSONObject(jString); 

        //json value 값 얻기 
        Stirng title = jsonObject.getString("title").toStirng();   //결과값 TEST 
        
         //이미지 사용법에 대해서는 이미 아시리라 믿고 패스 할께요;; 

       //JSONArray 사용법 
        JSONArray jArr = new JSONArray(jsonObject.getStirng("buttos")); 
         
       //StringArray에 buttons 의 title 키의 value값을 담겠습니다.  

        String btnTitle [] = new Stirng[jArr.length()]; 
      
         for(int i = 0; i < jArr.length(); i++){ 
                btnTitle [i] = jArr.getJSONObject(i).getString("title").toString(); 
                //출력하여 결과 얻기 
                system.out.println("btnTitle[" + i + "]=" + btnTitle[i]); 
         } 

       }catch(JSONException je){ 
           Log.E("jsonErr", "json에러입니당~", je); 
       }catch(Exception e){ 
           Log.E("execption", "파일이 없나봐용", e); 
       } 
    } 

휴 일일이 쓰려니 힘드네요;; 위와 같이 코딩을 하여 json파일에 들어있는 값들을 적용할수가 있습니다. 

이방법 알아내느라 아주 쬐금 고생을 했드랬죠 -_-;; 머라가 나빠서 이해력 속도가 느린;;; 

이미지 사용법에 관해서는 여기 훌륭하신 분들의 강좌를 보고 좀 변형해서 했기에;; 

제방법으로 하다가 머리가 아프실지 몰라 감히 올리지는 못하였네요 ㅎㅎㅎ 

이상으로 json 파일 사용에 대한 간단한 글을 마치도록 할께요... 

허접한 글이지만 저처럼 헤매시는 분들에게 조금이나마 도움이 되었으면 좋겠네요~~^^;;

Comments