【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解析。以後會陸陸續續的完善。