android客戶端與php伺服器的json資料簡單互動(二)
上一篇文章講的是最簡單的通過接送的格式完成android客戶端與php伺服器互動,也就是通過JSONObject物件來進行互動。
從上篇的文章程式碼就可以看出來,如果php陣列僅僅採用鍵值對的方式進行儲存,通過很簡單的方式轉換為json格式,之後在android客戶端進行
互動的時候通過JSONObject 也很快通過鍵值對的方式取到資料。
但是,有時候我們傳遞過來的引數並不是僅僅通過鍵值對的方式傳遞,可能比鍵值對的方式複雜一些(我們知道php陣列的功能非常強大,支援很多種的資料儲存方式,而直接通過一個json_encode() 函式就可以將php陣列轉化為json格式,也就是說存在不僅僅是鍵值對中一個key對應的都是一些簡單的資料型別,可能也是陣列等)。但是json同時也提供了JSONArray這一資料型別,通過一些簡單的操作就可以將其轉換成java中的ArrayList或者Map了。
android中包含四個與JSON有關的類和一個Exception,分別為
JSONObject:就如上篇文章提到的,包含一對兒(Key/Value)數值,注意這裡的Value值儲存一些基本的資料型別,
還有JSONArray,JSONOject或者預設值JSONOject.NULL object;
JSONArray:
它代表一組有序的數值,下面的程式碼可以非常直觀的瞭解其用法;
JSONStringer:
根據官方解釋,這個類可以幫助快速和便捷建立JSONtext.其最大的優點是可以減少由於格式的錯誤導致程式異常,引用這個類嚴格按照JSON
語法規則建立JSON text,每個JSONStringe實體只能可以對應建立一個JSON text。
JSONTokener:
這個是系統為JSONObject和JsonArray構造器解析JSON source string的類,它可以從source String中提取數值資訊。
JSONException:
JSON.org丟擲的異常資訊
以上幾個方面我們知道其實用處最多的就是JSONObject和JSONArray,下面的程式碼就可以很簡單的瞭解JSONArray的基本用法了。
private boolean getJson() { boolean result = false; HttpClient httpClient = new DefaultHttpClient(); //這裡是你與伺服器互動的地址 String validateUrl = "http://192.168.191.1/YCM/testjson.php"; //設定連結超時 httpClient.getParams().setParameter(CoreConnectionPNames. CONNECTION_TIMEOUT, 5000); //設定讀取超時 httpClient.getParams().setParameter( CoreConnectionPNames.SO_TIMEOUT, 5000); HttpPost httpRequst = new HttpPost(validateUrl); //準備傳輸的資料 List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); params.add(new BasicNameValuePair("user", "lewis")); params.add(new BasicNameValuePair("password", "123")); try { //傳送請求 httpRequst.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //得到響應 HttpResponse response = httpClient.execute(httpRequst); //返回值如果為200的話則證明成功的得到了資料 if(response.getStatusLine().getStatusCode() == 200) { StringBuilder builder = new StringBuilder(); //將得到的資料進行解析 BufferedReader buffer = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); for(String s =buffer.readLine(); s!= null; s = buffer.readLine()) { builder.append(s); } System.out.println(builder.toString()); /* * 資料形式 * {"success":true, "userList": [{"id":0,"name":"Sam"}, {"id":1,"name":"lewis"}, {"id":2,"name":"Tom"}, {"id":3,"name":"Marry"}, {"id":4,"name":"Todd"}}} */ //這個地方的資料形式那麼就不再是單獨的鍵值對了,還有一些其他的複雜形式 JSONObject mObject = new JSONObject(builder.toString()); boolean success = mObject.getBoolean("success"); JSONArray mJSONArray= mObject.getJSONArray("userList"); ArrayList<HashMap<String, String>>mArray = new ArrayList<HashMap<String,String>>(); for(int i = 0 ; i < mJSONArray.length(); i++) { JSONObject jsonItem = mJSONArray.getJSONObject(i); int id = jsonItem.getInt("id"); String name = jsonItem.getString("name"); HashMap map = new HashMap<String, String>(); map.put("id", id+""); map.put("name", name); mArray.add(map); } result = true; } } catch (Exception e) { e.printStackTrace(); } return result; }
這裡只要清楚了JSON傳輸資料的格式基本上是個什麼樣子的,那 麼該怎麼獲取其中的資料就很清楚了。
這裡php程式碼也非常的簡單,也採用模擬的形式
<?php
//這裡應該是是從Mysql資料庫中得到相應的資料,這裡僅僅是模擬過程,不再寫相應的資料庫互動程式碼
$username = str_replace(" ", "", $_POST['user']);
$password = str_replace(" ", "", $_POST['password']);
$id = 1;
/*z這裡嘗試不同種的陣列形式
*/
//這裡等同的是一個二維陣列
/*如果是一個二維陣列的話一定要對其進行鍵值對標識清楚
*/
$arr = array();
$arr['success'] = true;
$arrListInfo = array();
for( $i = 0; $i< 5; $i++)
{
$arrTemp = array(
'id' => $i,
'name' => "lewis");
$arrListInfo[] = $arrTemp;
}
$arr['userList'] =$arrListInfo;
//var_dump($arr);
$strr = json_encode($arr);// 如果直接在瀏覽器中執行該程式碼就可以很清楚的看到JSON採用的格式方式了
echo($strr);
?>
這裡例子不是很多,舉得例子僅僅是一個有鍵值對和陣列都存在的例子,如果仍然有疑問,可以參考一下點選開啟連結,這篇文庫中的例子非常多,舉了好幾種情況的例子,大家可以參考一下~
我想只要靈活運用了php陣列,JsonObjecty以及JSONArray的話,那麼從伺服器獲取一些簡單的資料將不是問題。這裡也充分的展現了php陣列的魅力,
充分體現了php陣列的靈活性。