Java資料解析之JSON
文章大綱
一、JSON介紹
二、常見框架介紹與實戰
三、Studio中GsonFormat外掛使用
四、專案原始碼下載(含參考資料)
五、參考文件

一、JSON介紹
1. 簡介
JSON 的全稱是 JavaScript Object Notation,是一種輕量級的資料交換格 式。
2. 特點
(1)JSON 比 XML 資料傳輸的有效性要高出很多
(2)JSON 完全獨立於程式語言
(3)本質就是具有特定格式的字串
3. JSON 資料格式
整體結構
String json1 = "{"id":12,"name":"Tom"}" String json2 = "[{"id":12,"name":"Tom"},{"id":12,"name":"Tom"}]"
Json 陣列
(1)Json 陣列的結構: [value1, value2, value3]
(2)例子:
[1, “ab”,[], {“n”:123, “b”:”abc”}] 正確 [1, “a”:3] 錯誤
Json 物件
(1)Json 物件的結構: {key1:value1, key2:value2, key3:value3}
(2)key 的資料型別: 字串
(3)value 的資料型別: 數值、字串、null、json 陣列 []、json 物件 {} (4)例子:
{“name”:”TOM”,“age”:12} 正確 {“aa”:“a”, 3} 錯誤
4. 原始的JSON解析實戰
將json格式的字元竄{}轉換為java物件
API:JsonObject
JSONObject(String json) : 將 json 字串解析為 json 物件
Xxx getXxx(String name) : 根據 name, 在 json 物件中得到對應的 Value
private void jsonToJavaObjectByNative() { //獲取或者建立json資料 String json = "{\n" + "\t\"id\":2, \"name\":\"大蝦\", \n" + "\t\"price\":12.3, \n" + "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" + "}\n"; //解析json JSONObject jsonObject; //使用bean ShopInfo shopinfo = null; try { jsonObject = new JSONObject(json); int id = jsonObject.getInt("id"); int id1 = jsonObject.optInt("id");//最好用opt方法,不會報異常 String name = jsonObject.optString("name");//最好用opt方法,不會報異常 double imagePath = jsonObject.optDouble("price");//最好用opt方法,不會報異常 String price = jsonObject.optString("imagePath");//最好用opt方法,不會報異常 shopinfo= new ShopInfo(id,name,imagePath,price);//把資料放進來 } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
將json格式的字元竄{}轉換為java物件的list
API:JSONArray
JSONArray(String json) : 將 json 字串解析為 json 陣列
int length() : 得到 json 陣列中元素的個數
Xxx getXxx(int index) : 根據下標得到 json 陣列中對應的元素資料
private void jsonToJavaListByNative() { // TODO Auto-generated method stub //獲取或者建立json資料 String json= "[\n" + "{\n" + "\"id\": 1,\n" + "\"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +"\"name\": \"大蝦 1\",\n" +"\"price\": 12.3\n" + "},\n" + "{\n" + "\"id\": 2,\n" + "\"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" + "\"name\": \"大蝦 2\",\n" + "\"price\": 12.5\n" + "}\n" + "]"; //存放shopinfo集合 List<ShopInfo> shops =new ArrayList<ShopInfo>(); //解析json try { JSONArray jsonArray = new JSONArray(json); //遍歷陣列 for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); //判斷資料是否為空 if(jsonObject != null){ int id=jsonObject.optInt("id"); String name = jsonObject.optString("name");//最好用opt方法,不會報異常 double imagePath = jsonObject.optDouble("price");//最好用opt方法,不會報異常 String price = jsonObject.optString("imagePath");//最好用opt方法,不會報異常 //封裝java物件 ShopInfo shopinfo= new ShopInfo(id,name,imagePath,price);//把資料放進來 shops.add(shopinfo); } } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
複雜json資料解析
/** * 複雜json資料解析 * * 就是第一層是大資料包括第二第三層的,第二層要從第一層裡拿到一個key然後獲取下面的資料,然後第三層又是從第二層裡拿到一個key然後獲取裡面的資料 * * 一層一層的解析,從大到小 */ private void jsonToJavaOfComplex() { //獲取或者建立json資料 String json ="{\n" + " \"data\": {\n" + " \"count\": 5,\n" + " \"items\": [\n" + " {\n" + " \"id\": 45,\n" + " \"title\": \" 堅果\"\n" + " },\n" + " {\n" + " \"id\": 132,\n" + " \"title\": \" 炒貨\"\n" + " },\n" + " {\n" + " \"id\": 166,\n" + " \"title\": \" 蜜餞\"\n" + " },\n" + " {\n" + " \"id\": 195,\n" + " \"title\": \" 果脯\"\n" + " },\n" + " {\n" + " \"id\": 196,\n" + " \"title\": \" 禮盒\"\n" + " }\n" + " ]\n" + " },\n" + " \"rs_code\": \"1000\",\n" + " \"rs_msg\": \"success\"\n" + "}"; //封裝java物件 DateInfo dateIndo = new DateInfo(); JSONObject jsonObject; //解析json try { jsonObject = new JSONObject(json); //第一層解析一層一層解析 JSONObject date = jsonObject.optJSONObject("data");//date是一個集合 String rs_code = jsonObject.optString("rs_code"); String rs_msg = jsonObject.optString("rs_msg"); //第一層封裝一層一層封裝 dateIndo.setRs_code(rs_msg); dateIndo.setRs_msg(rs_msg); DateInfo.DataBean dateBean =new DateInfo.DataBean();//集合 dateIndo.setData(dateBean); //第二層解析 int count =date.optInt("count"); JSONArray items = date.optJSONArray("items"); //第二層資料封裝 dateBean.setCount(count);//從集合裡面拿資料 List<DateInfo.DataBean.ItemsBean> itemsBean = new ArrayList<DateInfo.DataBean.ItemsBean>(); dateBean.setItems(itemsBean); //第三層解析 for (int i = 0; i < items.length(); i++) { JSONObject jsonObject1= items.optJSONObject(i); if(jsonObject1 != null){ int id = jsonObject1.optInt("id"); String title = jsonObject1.optString("title"); //第三層資料的封裝 DateInfo.DataBean.ItemsBean bean = new DateInfo.DataBean.ItemsBean(); bean.setId(id); bean.setTitle(title); itemsBean.add(bean); } } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } //顯示json資料 tv_native_orignal.setText(json); tv_native_last.setText(dateIndo.toString()); }
二、常見框架介紹與實戰
1. GSON
簡介
GSON是Google提供的用來在Java物件和JSON資料之間進行對映的Java類庫。可以將一個Json字元轉成一個Java物件,或者將一個Java轉化為Json字串。
特點
(1)快速、高效
(2)程式碼量少、簡潔
(3)面向物件
(4)資料傳遞和解析方便
程式碼實戰
將 json 格式的字串{}轉換為 Java 物件
(1)用到的 API
<T> T fromJson(String json, Class<T> classOfT);//將 json 物件轉換為 Java 物件的方法
注意:要求 json 物件中的 key 的名稱與 java 物件對應的類中的屬性名要相同
(2)使用步驟
將 Gson 的 jar 包匯入到專案中
建立Gson物件 : Gson gson = new Gson(); (3)通過建立的Gson物件呼叫fromJson()方法,返回該JSON資料對應的Java物件
/** * //將json格式的字元竄{}轉換為java物件 */ private void jsonToJavaObjectByGson() { //1獲取或建立json資料 String json ="{\n" + "\t\"id\":2, \"name\":\"大蝦\", \n" + "\t\"price\":12.3, \n" + "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" + "}\n"; //2解析json資料 Gson gson =new Gson(); //第一個引數是要解析的資料,第二個引數是解析生成的java物件的類 ShopInfo shopInfo =gson.fromJson(json, ShopInfo.class); }
將json格式的字元竄{}轉換為java物件的list
(1)用到的 API
T fromJson(String json, Type typeOfT);//將 json 陣列轉換為 Java 物件的 list 注意:要求 json 物件中的 key 的名稱與 java 物件對應的類中的屬性名要相同
(2)使用步驟
將 Gson 的 jar 包匯入到專案中
建立Gson物件 : Gson gson = new Gson(); (3)通過建立的Gson物件呼叫fromJson()方法,返回該JSON資料對應的Java集合: List<ShopInfo> shops = gson.fromJson(json, new
TypeToken<List<ShopInfo>>() {}.getType());
private void jsonToJavaListByGson() { //1獲取或建立json資料 String json = "[\n" + "{\n" + "\"id\": 1,\n" + "\"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" + "\"name\": \"大蝦 1\",\n" + "\"price\": 12.3\n" +"},\n" +"{\n" + "\"id\": 2,\n" + "\"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" + "\"name\": \"大蝦 2\",\n" + "\"price\": 12.5\n" +"}\n" + "]"; //2解析json資料 Gson gson =new Gson(); //List<ShopInfo>:是要返回資料的集合 List<ShopInfo> shops = gson.fromJson(json,new TypeToken<List<ShopInfo>>(){}.getType()); //3顯示資料 tv_gson_orignal.setText(json); tv_gson_last.setText(shops.toString()); }
將java物件轉換為json字元竄
(1)用到的 API
String toJson(Object src);
(2)使用步驟
將 Gson 的 jar 包匯入到專案中
建立Gson物件 : Gson gson = new Gson(); (3)通過建立的Gson物件呼叫toJson()方法,返回json資料:
ShopInfo shop = new ShopInfo(1, "鮑魚", 250.0, ""); String json = gson.toJson(shop);
private void javaToJSONByGson() { //1獲取或建立java資料 ShopInfo shopInfo = new ShopInfo(1,"鮑魚",250.0,"baoyu"); //2生成json資料 Gson gson = new Gson(); String json = gson.toJson(shopInfo); //3顯示資料 tv_gson_orignal.setText(shopInfo.toString()); tv_gson_last.setText(json); }
將 Java 物件的 List 轉換為 json 字串[]
(1)用到的 API
String toJson(Object src);
(2)使用步驟
將 Gson 的 jar 包匯入到專案中
建立Gson物件 : Gson gson = new Gson(); (3)通過建立的Gson物件呼叫toJson()方法,返回json資料:
List<ShopInfo> shops = new ArrayList<>(); String json = gson.toJson(shops);
/** * //將java物件的list轉換為json字元竄 */ private void javaToJSONArrayByGson() { //1獲取或建立java資料 List<ShopInfo> shops =new ArrayList<ShopInfo>(); ShopInfo baoyu = new ShopInfo(1,"鮑魚",250.0,"baoyu"); ShopInfo longxia = new ShopInfo(1,"龍蝦",250.0,"longxia"); shops.add(baoyu); shops.add(longxia); //2生成json資料 Gson gson = new Gson(); String json = gson.toJson(shops); //3顯示資料 tv_gson_orignal.setText(shops.toString()); tv_gson_last.setText(json); }
2. FastJson
簡介
在日常的java專案開發中,JSON的使用越來越頻繁,對於Json的處理工具也有很多。接下來就介紹一下阿里開源的一個高效能的JSON框架FastJson,功能完善,完全支援 標準JSON庫 ,現在已經越來越受到開發者的青睞。
2. 特點
Fastjson 是一個 Java 語言編寫的高效能功能完善的 JSON 庫。它採用一種“假定有序快速匹配”的演算法,把JSONParse的效能提升到極致,是目前Java語言中最快的JSON庫。
程式碼實戰
將 json 格式的字串{}轉換為 Java 物件
(1)用到的 API
< T > T parseObject(String json, Class<T> classOfT); //將 json 物件轉換為 Java物件的方法
注意:要求 json 物件中的 key 的名稱與 java 物件對應的類中的屬性名要相同
(2)使用步驟
匯入 fastjson 的 jar 包 (2)JSON呼叫parseObject()方法,獲取轉換後的Java物件
private void jsonToJavaObjectByFastJson() { // 1 獲取或建立 JSON 資料 String json = "{\n" + "\t\"id\":2, \"name\":\"大蝦\", \n" + "\t\"price\":12.3, \n" + "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\ "\n" + "}\n"; // 2 解析 JSON 資料 ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class); }
將 json 格式的字串[]轉換為 Java 物件的 List
(1)用到的 API
List<T> parseArray(String json,Class<T> classOfT);//將 json 陣列轉換為 Java 物件的 list
注意:要求 json 物件中的 key 的名稱與 java 物件對應的類中的屬性名要相同
(2)使用步驟
匯入 fastjson 的 jar 包 (2)JSON呼叫parseArray()方法,獲取轉換後的Java集合
private void jsonToJavaListByFastJson() { // 1 獲取或建立 JSON 資料 String json = "[\n" + " {\n"+ " \"id\": 1,\n" + " \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" + " " " " " " \"name\": \"大蝦 1\",\n" + \"price\": 12.3\n" + },\n" + {\n"+ \"id\": 2,\n" + \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" + " \"name\": \"大蝦 2\",\n" + " \"price\": 12.5\n" + " }\n"+ "]"; // 2 解析 JSON 資料 List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class); }
將 Java 物件轉換為 json 字串
(1)用到的 API
String toJSONString(Object object);
(2)使用步驟
匯入 fastjson 的 jar 包
JSON呼叫toJSONString()方法,獲取轉換後的json資料
private void javaToJsonObjectByFastJson() { // 1 獲取 Java 物件 ShopInfo shopInfo = new ShopInfo(1, "鮑魚", 250.0, "baoyu"); // 2 生成 JSON 資料 String json = JSON.toJSONString(shopInfo); // 3 資料顯示 tv_fastjson_orignal.setText(shopInfo.toString()); tv_fastjson_last.setText(json); }
將 Java 物件的 List 轉換為 json 字串[]
(1)用到的 API
String toJSONString(Object object);
(2)使用步驟
匯入 fastjson 的 jar 包
JSON呼叫toJSONString()方法,獲取轉換後的json資料
private void javaToJsonArrayByFastJson() { // 1 獲取 Java 集合 List<ShopInfo> shops = new ArrayList<>(); ShopInfo baoyu = new ShopInfo(1, "鮑魚", 250.0, "baoyu"); ShopInfo longxia = new ShopInfo(2, "龍蝦", 251.0, "longxia"); shops.add(baoyu); shops.add(longxia); // 2 生成 JSON 資料 String json = JSON.toJSONString(shops); // 3 資料顯示 tv_fastjson_orignal.setText(shops.toString()); tv_fastjson_last.setText(json); }
三、Studio中GsonFormat外掛使用
1. GsonFormat是什麼
可根據xml內容快速生成bean類的外掛
2. 使用方法
開啟 Android studio 頁面,點選設定按鈕

點選 Plugins 按鈕

在右側輸入框中輸入 gsonformat,然後點選中間部位的 Browse(必須在聯網情況下點選)

選擇 GsonFormat,點選右側的安裝外掛

重啟一下 Android studio
在 Android studio 中建立一個類

在該類中同時按下 alt+shift+s,並點選 GsonFormat

四、專案原始碼下載(含參考資料)
連結: https://pan.baidu.com/s/1PEz1jMc6B2CvB8HQn6A-pg
密碼:rpjy