?JSON 使用講解?這篇文章講解了,JSON的介紹以及使用GSON解析。今天,我們就在Android項目中使用兩種方式解析JSON數據。如果你對JSON,還不熟悉,那么請看JSON 使用講解。
一.搭建服務以及制造JSON數據。
1.服務器選擇的Tomcat,下載鏈接。下載安裝成功后,服務啟動后,在瀏覽器中輸入'http://localhost:8080/',看到如下截圖,那就說明啟動成功了。
2.Tomcat服務器啟動好后,找到它的安裝目錄‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安裝目錄是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在該目錄下,新建文件夾‘json’,在該文件夾中,創建文件‘get_data.json’,在該文件中輸入JSON字符串,格式如下‘[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]’。
3.此時在瀏覽器中輸入‘http://localhost:8080/json/get_data.json’,如果出現如下截圖,說明上面的操作是成功的。
??? 經過上面3步,我們就把JSON數據創建好了,接下來就是Android客戶端的實現了。
二.Android客戶端的實現。
1.創建Android項目。這個不用詳細描述了。
2.首先記得在AndroidManifest.xml中加入網絡權限。
?
- <uses-permission?android:name="android.permission.INTERNET"/>??
3.網絡請求實現。使用URLConnection實現的。
?
?
- public?static?String?getData1(String?urlStr)?{??
- ????????String?resultData?=?"";??
- ????????//?構造URL??
- ????????try?{??
- ????????????URL?url?=?new?URL(urlStr);??
- ????????????//?打開連接??
- ????????????URLConnection?con?=?url.openConnection();??
- ????????????con.setConnectTimeout(10?*?1000);??
- ????????????con.setReadTimeout(10?*?1000);??
- ????????????InputStream?is?=?con.getInputStream();??
- ????????????BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(is));??
- ????????????String?line?=?null;??
- ????????????StringBuffer?sb?=?new?StringBuffer();??
- ????????????while?((line?=?br.readLine())?!=?null)?{??
- ????????????????sb.append(line);??
- ????????????}??
- ????????????resultData=sb.toString();??
- ????????????return?resultData;??
- ????????}?catch?(MalformedURLException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}?catch?(IOException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return?null;??
- ????}??
4.功能實現。
?
??? 在MainActivity中加入一個按鈕,點擊的時候獲取網絡數據,并且請求網絡要在子線程中進行。有一點需要補充就是手機訪問電腦時的IP地址,如果你使用手機訪問電腦,IP地址還是‘localhost’,肯定是訪問不了的,因為‘localhost’指的是本機,如果使用手機訪問‘localhost’,那肯定是訪問不到電腦的。這個IP可以有兩種寫法,一種是,當你使用模擬器訪問的話,IP可以寫成‘10.0.2.2’;另一種是,直接寫為電腦在局域網內的IP地址,例如‘192.168.1.114’(我電腦的IP地址);建議直接寫成電腦在局域網內的IP地址。詳細實現如下代碼所示,
?
- public?class?MainActivity?extends?Activity?{??
- ??
- ????String?url?=?"http://192.168.1.114:8080/json/get_data.json";??
- ??
- ????@Override??
- ????protected?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.activity_main);??
- ??
- ????????findViewById(R.id.btn_getdata).setOnClickListener(??
- ????????????????new?OnClickListener()?{??
- ??
- ????????????????????@Override??
- ????????????????????public?void?onClick(View?v)?{??
- ????????????????????????//?TODO?Auto-generated?method?stub??
- ????????????????????????new?MyThread().start();??
- ????????????????????}??
- ????????????????});??
- ????}??
- ??
- ????class?MyThread?extends?Thread?{??
- ????????@Override??
- ????????public?void?run()?{??
- ????????????String?jsonStr?=?NetWorkUtils.getData1(url);??
- ????????????if?(!TextUtils.isEmpty(jsonStr))?{??
- ????????????????Log.e("jsonStr",?jsonStr);??
- ?????????????????parseJsonData(jsonStr);??
- //??????????????parseJsonData1(jsonStr);??
- ????????????}??
- ????????}??
- ????}??
- }??
解析JSON采用三種方式。
?
5.使用JSONObject解析。代碼很簡單,就不多說了,示例如下,
?
- /**?
- ?????*?使用JSONArray和JSONObject解析?
- ?????*??
- ?????*?@param?jsonStr?
- ?????*/??
- ????private?void?parseJsonData(String?jsonStr)?{??
- ????????try?{??
- ????????????JSONArray?array?=?new?JSONArray(jsonStr);??
- ????????????for?(int?i?=?0;?i?<?array.length();?i++)?{??
- ????????????????JSONObject?jsonObject?=?array.getJSONObject(i);??
- ????????????????int?id?=?jsonObject.getInt("id");??
- ????????????????String?name?=?jsonObject.getString("name");??
- ????????????????int?age?=?jsonObject.getInt("age");??
- ????????????????Person?person?=?new?Person(id,?name,?age);??
- ????????????????Log.e("person",?person.toString());??
- ????????????}??
- ????????}?catch?(JSONException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
6.使用GSON解析。代碼就更簡單,示例如下,
- /**?
- ?????*?使用GSON解析?
- ?????*??
- ?????*?@param?jsonStr?
- ?????*/??
- ????private?void?parseJsonData1(String?jsonStr)?{??
- ????????Gson?gson?=?new?Gson();??
- ????????List<Person>?list?=?gson.fromJson(jsonStr,??
- ????????????????new?TypeToken<List<Person>>()?{??
- ????????????????}.getType());??
- ????????for?(Person?person?:?list)?{??
- ????????????Log.e("person",?person.toString());??
- ????????}??
- ????}??
?
7.使用JackJson解析,做了一個JackJson工具類,代碼如下:
?
- /**?
- ?*?jackjson??
- ?*/??
- public?class?JackJsonUtils?{??
- ??
- ??????
- ????/**?
- ?????*?解析?
- ?????*??
- ?????*?@param?content?
- ?????*?@param?valueType?
- ?????*?@return?
- ?????*/??
- ????public?static?<T>?T?fromJson(String?content,?Class<T>?valueType)?{??
- ????????????ObjectMapper?objectMapper?=?new?ObjectMapper();??
- ????????try?{??
- ????????????return?objectMapper.readValue(content,?valueType);??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return?null;??
- ????}??
- ??
- ????/**?
- ?????*?生成json?
- ?????*??
- ?????*?@param?object?
- ?????*?@return?
- ?????*/??
- ????public?static?String?toJSon(Object?object)?{??
- ????????ObjectMapper?objectMapper?=?new?ObjectMapper();??
- ????????try?{??
- ????????????return?objectMapper.writeValueAsString(object);??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return?null;??
- ????}??
- }??
調用代碼,
?
?
- /**?
- ?*?jackjson解析?
- ?*??
- ?*?@param?jsonStr?
- ?*/??
- public?void?parserByJackJson(String?jsonStr)?{??
- ????Person[]?persons?=?JackJsonUtils.fromJson(jsonStr,?Person[].class);??
- ????for?(Person?person?:?persons)?{??
- ????????Log.e("person",?person.toString());??
- ????}??
- }??
?
運行后的截圖如下,
PS:也許你使用JackJson解析可能會報錯,日志截圖如下:
解決方法是,在你的實體類中加入無參的構造函數就完美解決了!希望能幫到你!實體類的代碼如下:
?
- public?class?Person?implements?Serializable?{??
- ????/**?
- ?????*??
- ?????*/??
- ????private?static?final?long?serialVersionUID?=?1L;??
- ????private?int?id;??
- ????private?String?name;??
- ????private?int?age;??
- ??
- ????public?Person()?{??
- ????????super();??
- ????????//?TODO?Auto-generated?constructor?stub??
- ????}??
- ??
- ????public?Person(int?id,?String?name,?int?age)?{??
- ????????super();??
- ????????this.id?=?id;??
- ????????this.name?=?name;??
- ????????this.age?=?age;??
- ????}??
- ??
- ????public?int?getId()?{??
- ????????return?id;??
- ????}??
- ??
- ????public?void?setId(int?id)?{??
- ????????this.id?=?id;??
- ????}??
- ??
- ????public?String?getName()?{??
- ????????return?name;??
- ????}??
- ??
- ????public?void?setName(String?name)?{??
- ????????this.name?=?name;??
- ????}??
- ??
- ????public?int?getAge()?{??
- ????????return?age;??
- ????}??
- ??
- ????public?void?setAge(int?age)?{??
- ????????this.age?=?age;??
- ????}??
- ??
- ????@Override??
- ????public?String?toString()?{??
- ????????return?"Person?[id="?+?id?+?",?name="?+?name?+?",?age="?+?age?+?"]";??
- ????}??
- ??
- }??
?
三.總結。
??? 使用了三種方式去解析JSON數據。個人建議,如果你是在Android開發,建議使用GSON,畢竟是谷歌自己的東西,使用放心,可靠!如果你是做后臺服務或者接口開發,建議使用JackJson,強大、快速!相信你現在已經對JSON解析有更深入的了解了