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

五、參考文檔

    1. http://www.atguigu.com
    2. https://www.cnblogs.com/1024zy/p/6370305.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM