文章大綱 一、JSON介紹二、常見框架介紹與實戰三、Studio中GsonFormat插件使用四、項目源碼下載(含參考資料)五、參考文檔 一、JSON介紹 1. 簡介 JSON 的全稱是 JavaScript Object Notation,是一種輕量級的數據交換格 式。 2. 特點 (1)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