2011年12月28日 星期三

Android - Json解析 (Json String parser)

JSON為新一代的資料傳輸格式,這裡有一篇文章對XML和JSON進行了清楚的比較。下面的程式透過JSONObjectJSONArray展示出如何解析放在SD卡裡面的JSON資料,檔名取為json_file。
下面為json_file的內容
{
    "student num":"3",
    "student":
    [
      {"name":"Gill",
       "age":"15"},
      {"name":"Tom",
       "age":"14"},
      {"name":"John",
       "age":"17"}
    ]
}

讀取JSON的觀念是針對每個Key去讀取其Value的,可以想像{}裡面就是一個JSONObject。而因為JSON裡面的資料可以像陣列般包含多項內容,這時候就用getJSONArray一口氣全部抓出來。大致上的流程是

(1)建立字串:內容為JSON所有的資料

(2)利用上述字串建立JSONObject

(3)利用JSONObjec取得資料 : 像是利用getInt(),getString()....等

(4)如果要解析的資料是陣列式的 : 先利用getJSONArray取出JSONARRAY後,再配合for迴圈把每個細項也就是JSONObject建立起來出來。有了JSONObject要讀資料,就和步驟(3)一樣。


程式碼如下:
public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startParser();
    }

    public void startParser() {
        try {
            String jsonString = readJsonFile();       
            JSONObject jsonResponse = new JSONObject(jsonString);             
     
            //直接由JSONObject取出資料
            Integer studentNum = jsonResponse.getInt("student num");
            Log.d("Test","The number of student is :" + studentNum);
           
            //處理陣列型式的資料要多一個步驟
            //就是先建立JSONArray,再搭配for迴圈建立JSONObject
            JSONArray jsonArray = jsonResponse.getJSONArray("student");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Log.d("Test","The name value is :" + jsonObject.getString("name"));
                Log.d("Test","The age value is :" + jsonObject.getString("age"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    //這裡先將檔案json_file裡的內容讀出,再轉換成字串
    private String readJsonFile(){
        FileInputStream fin;
        String returnString = "";
        try {
            fin = new FileInputStream(new File("sdcard/tmp/json_file"));
            byte[] buffer = new byte[fin.available()];
            while (fin.read(buffer) != -1) ;
            returnString = new String(buffer);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return returnString;
    }
}

執行結果如下:

沒有留言:

張貼留言