Android JSON基本介紹與範例


=================首先介紹JSON================

JSON 全名為 JavaScript Object Notation ,在Android網路傳輸資料時經常會使用JSON結構來儲存資料而 JSON 又包含了 JSONObject 與 JSONArray , JSONObject 就是JSON格式的物件, JSONArray 為JSONObject所組成的陣列


在 JSONObject 包含一個欄位key與內容,如:
{"欄位Key":"資訊內容"}
(欄位Key為String,資訊內容可以為各種型態,如int、boolean、String...等)

當然物件內不會單純只有一筆資料,如:
{"欄位Key":"資訊內容","欄位Key":"資訊內容","欄位Key":"資訊內容"}


JSONArray則是許多JSONObject組成,如:
[{"欄位Key":"資訊內容"},{"欄位Key":"資訊內容"},{"欄位Key":"資訊內容"},{"欄位Key":"資訊內容"}]

可以發現物件是使用大括號{}包覆資料,陣列是使用中括號[]包覆物件
JSON也可以靈活的組裝擁有很多變化,如JSONObject內包含JSONObject,在包含JSONArray....等等各類型一層一層包覆,相對的解析也要一層一層解



=================JSON應用=================

-------------範例1:JSONObject內包覆一個JSONObject


在封裝時:

//用來包覆的JSON物件
JSONObject json_obj_2 = new JSONObject();    //用來當內層被包覆的JSON物件
//首先將2號JSON物件存好內容
json_obj_2.put("id",2);
json_obj_2.put("info","內層物件訊息");
//將1號JSON物件存好內容
json_obj_1.put("id",1);
json_obj_1.put("info","外層物件訊息");
//再來將2號物件設好key並丟進1號物件
json_obj_1.put("obj",json_obj_2);
//最後json_obj_1內容印出(當JSON+"\n"就可成為String印出,在傳輸時也必須用JSON+"\n")
Log.i("text", "json_obj_1="+json_obj_1+"\n");



最後印出結果為:
{"id":1,"info":"外層物件訊息","obj":{"id":2,"info":"內層物件訊息"}}



接收時拆解方法為:


//一開始從網路接收通常為String型態,tmp為接收到的String,為避免串流內有其他資料只需抓取{}間的內容
tmp=tmp.substring(tmp.indexOf("{"), tmp.lastIndexOf("}") + 1);
JSONObject json_read=new JSONObject(tmp);    //將資料丟進JSONObject
//接下來選擇型態使用get並填入key取值
int id_1=json_read.getInt("id");
String info_1=json_read.getString("info");
JSONObject json_obj=json_read.getJSONObject("obj");
int id_2=json_obj.getInt("id");
String info_2=json_obj.getString("info");




---------------範例2:JSONObject內包覆一個JSONArray

在封裝時:

//用來包覆JSONArray的JSON物件
JSONObject json_obj_arr = new JSONObject();            //用來當內層被丟進陣列內的JSON物件
JSONArray json_arr = new JSONArray();                //JSON陣列
//首先將要丟進陣列內的JSON物件存好內容後丟進陣列
for(int i=0;i<3;i++){
    json_obj_arr.put("id",i);
    json_obj_arr.put("info","陣列內的物件訊息");
    json_arr.put(json_obj_arr);
}
//將JSON物件存好內容
json_obj.put("id",1);
json_obj.put("info","外層物件訊息");
//再來將JSON陣列設定key丟進JSON物件
json_obj.put("arr",json_arr);
//最後json_obj內容印出(當JSON+"\n"就可成為String印出,在傳輸時也必須用JSON+"\n")
Log.i("text", "json_obj="+json_obj+"\n");



最後印出結果為:
{"id":1,"info":"外層物件訊息","arr":[{"id":0,"info":"陣列內的物件訊息"},{"id":1,"info":"陣列內的物件訊息"},{"id":2,"info":"陣列內的物件訊息"}]}



接收時拆解方法為:

//一開始從網路接收通常為String型態,tmp為接收到的String,為避免串流內有其他資料只需抓取{}間的內容
tmp=tmp.substring(tmp.indexOf("{"), tmp.lastIndexOf("}") + 1);
JSONObject json_read=new JSONObject(tmp);        //將資料丟進JSONObject
//接下來選擇型態使用get並填入key取值
int id_obj=json_read.getInt("id");
String info_obj=json_read.getString("info");
JSONArray json_arr=json_read.getJSONArray("arr");
for(int i=0;i<3;i++){                        //用for抓陣列內每個物件的資料
    int id_arr=json_arr.get(i).getInt("id");
    String info_arr=json_arr.get(i).getString("info");
}





===============補充=====================

以上是示範JSON格式的2種封裝與讀取方式,拆解與封裝還是要先跟伺服器端溝通傳送與接收的資料

在陣列類型(Boolean[]、String[]、int[]...等)要丟進JSONArray其實有另一個簡單的方法:
int[] i={11,22,33,44,55};
JSONArray json_arr=new JSONArray(i);    //在new JSONArray時直接將陣列丟進去即可


我目前使用到的地方只有在HTTP傳輸跟Socket傳輸時使用,等以後有應用到更多東西時再回來補充







arrow
arrow

    SIN 發表在 痞客邦 留言(0) 人氣()