1. 程式人生 > >【Android】Json解析初步

【Android】Json解析初步

Json解析是用來接收網路端資訊的重要手段,要吃透,基礎紮實。

Json語句:類似map的鍵值對,[{ “key:“”value“ }]例如[{"name:""方世玉","age:""18"}]

這裡只介紹當inputStream流入android端時,如何去解析。

首先,這裡需要介紹一下HTTP請求,上篇文章裡,簡單說明了一下什麼事HTTP,這裡就以HTTPURLConnection使用POST為例項,介紹如何從android

發出請求,並如何解析從web端帶來的json.

public static Competitor getInformation(String use, String pwd) throws Exception {
		// TODO Auto-generated method stub
		//寢室ip:192.168
		//機房ip:192.168
		String path = "http://192.168.X。XX:8080/Teenis_game/AndroidLogin?format=json";
		
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setReadTimeout(5000);
		conn.setRequestMethod("POST");
		String entity ="&&Username="+use+"&&Password="+pwd;
	
		
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//內容型別
		conn.setRequestProperty("Content-Length",String.valueOf(entity.getBytes().length));
		OutputStream ouStream=conn.getOutputStream();//通過輸出流物件,傳實體(位元組)資料
		ouStream.write(entity.getBytes());
		if(conn.getResponseCode()==200){
			InputStream inStream = conn.getInputStream();
			return parseJSON(inStream);
	/*		byte[] data=StreamTool.read(inStream);
			System.out.println("&&&&&&&&"+data);
			System.out.println("&&&&&&&&"+data.length);
			System.out.println("&&&&&&&&"+data.toString());
			String result = new String(data,"utf-8");//這裡的的utf-8是指的傳輸過來的data的編碼方式,並不是你改變的編碼方式,這裡只是按照data原來的編碼方式進行解碼而已
			//這裡曾出現問題,每次複習請看這裡
			/*
			 * 出現問題:將byte陣列按照utf-8格式解碼後,出現雖然解碼正確但是有很多?在後面
			 * 解決辦法:將StreamTool裡的buffer陣列長度改為1;
			 * 這裡知道了一個漢字按照utf-8解碼時,只佔一個byte,
			 */
	/*	     System.out.println("**********"+result);
			if(result.equals("成功")){
				 boolean flag = true;
				 return flag;
			}*/
		}
		return null;
		
		
	}
	private static  Competitor parseJSON(InputStream inStrean) throws Exception{
		byte[] data = StreamTool.read(inStrean);
		String json = new String (data, "UTF-8");
		//System.out.println("*******json="+json);
		Competitor c = null;
		JSONObject Jsonobject=null;
		JSONArray jsonarray = new JSONArray(json);
		for (int i=0;i<jsonarray.length();i++){
			Jsonobject = jsonarray.getJSONObject(i);
			c= new Competitor();
			c.setId(Integer.parseInt(Jsonobject.getString("id")));
			c.setUsername(Jsonobject.getString("username"));
			c.setPassword(Jsonobject.getString("password"));
			c.setRelname(Jsonobject.getString("relname"));
			c.setMatchage(Integer.parseInt(Jsonobject.getString("Matchage")));
			
			java.sql.Date date=java.sql.Date.valueOf(Jsonobject.getString("borth"));
			c.setBorth(date);
			
			c.setAdress(Jsonobject.getString("adress"));
			c.setSex(Jsonobject.getString("sex"));
			
		}
		return c;
		
	}
	
	

這是我做工程裡的程式碼,直接拿了過來,裡面也有很多註釋,相信能夠初步理解json的用法。

這裡對一些重要的步驟,作進一步解釋:

首先是path路徑問題,因為我們android模擬器的系統和電腦的系統會在localhost上衝突,所以我們只能通過區域網ip去訪問我們的Tomact的web。

查詢ip:cmd————>ipconfig

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//內容型別
這個是定義我們傳輸內容的型別,稍後會寫文章介紹傳輸內容為Object物件時,應該如何設定。

InputStream inStream = conn.getInputStream();
實際上,當語句執行到這裡事,android端才與web建立聯絡,並將內容傳送出去。

 byte[] data = StreamTool.read(inStrean);

這裡用到了我抽象出來的一個讀取inputStream的工具類,:

public class StreamTool {

	
		public static byte[] read(InputStream inStream) throws Exception {
			// TODO Auto-generated method stub
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len =0;
			while((len=inStream.read(buffer))!= -1){
				outStream.write(buffer, 0, len);
			}
			inStream.close();
			return outStream.toByteArray();
		};
	

}


這個工具類裡有個快取陣列,這裡的大小是自己定義的。

outStream.write(buffer, 0, len);

這裡容易出現錯誤,一定是從o讀到len的結束,而不是buffer.size();雖然這樣寫邏輯上是沒有錯誤的,但是因為你的buffer長度是1024kb,

所以當接收的資訊小於1024時。就會有錯誤。當把資料讀完之後,發現仍有記憶體沒有讀,於是,就會多出許多佔位符。

所以這裡一定注意,將讀取長度,定義為len而不是buffer.size();

json解析其實很容易理解,核心的東西都是我們經常用到的主要就是應用,在實際執行中觀察有什麼差異。

Jsonobject.getString("username")

這個就是json去解析字串,當然是符合json語法的字串。

其中獲取的語法有兩種,這裡的getString(),當鍵值對裡的value為空時,是會出現錯誤的。

但是optString(),當value為空時,並不會出錯,會自動為該key附一個特定的值,這裡用法的取捨就在於工程的需求了。

到這如果你覺得就結束的話,你會發現大錯特錯,這只是初步的JSON解析。以後會陸陸續續的完善。