1. 程式人生 > >android客戶端與php伺服器的json資料簡單互動(二)

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陣列的靈活性。