時間:2017年05月21日星期日
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...java
課程須知git
本課程面向全部使用Java語言進行開發的小夥伴。
JSON是行業內使用最爲普遍的數據傳輸格式
課程大綱github
JSON基礎知識 Java中兩種常見的JSON處理方式 綜合運用
什麼是JSONapache
JSON是一種與開發語言無關的、輕量級的數據格式。全稱JavaScript Object Notation。
優勢json
易於人的閱讀和編寫 易於程序解析與生成
一個簡單的JSON樣例數組
數據結構數據結構
Object:{} Array:, []
基本類型maven
string number true false null
Object:對象數據結構ide
使用花括號{}包含的鍵值對結構,Key必須是string類型,value爲任何基本類型或數據結構。
示意圖函數
Array:數組數據格式
使用中括號[]來起始,並用逗號, 來分隔元素。
示意圖
代碼演示:
{ "name" : "王小二", "age" : 25.2, "birthday" : "1990-01-01", "school" : "藍翔", "major" : ["理髮","挖掘機"], "has_girlfriend" : false, "car" : null, "house" : null, "comment" : "這是一個註釋" }
項目搭建
首先建立一個項目,教學使用maven進行構建,我學習時使用gradle進行構建。因本次課程以學習JSON爲主,因此省略項目搭建過程,具體源碼可參考個人github地址。
使用JSONObject生成JSON格式數據
代碼演示:
/** * 經過 JSONObject 生成JSON */ private static void createJsonByJsonObject() { JSONObject wangxiaoer = new JSONObject(); // 定義nullObject Object nullObject = null; wangxiaoer.put("name","王小二"); wangxiaoer.put("age",25.2); wangxiaoer.put("birthday","1990-01-01"); wangxiaoer.put("school","藍翔"); wangxiaoer.put("major",new String[]{"理髮","挖掘機"}); wangxiaoer.put("has_girlfriend",false); // 使用nullObject跳過編譯器檢查 wangxiaoer.put("car",nullObject); wangxiaoer.put("house",nullObject); wangxiaoer.put("comment","這是一個註釋"); System.out.println(wangxiaoer.toString()); }
代碼演示:
/** * 經過 HashMap 生成JSON */ public static void createJsonByMap(){ Map<String,Object> wangxiaoer = new HashMap<String,Object>(); Object nullObject = null; wangxiaoer.put("name","王小二"); wangxiaoer.put("age",25.2); wangxiaoer.put("birthday","1990-01-01"); wangxiaoer.put("school","藍翔"); wangxiaoer.put("major",new String[]{"理髮","挖掘機"}); wangxiaoer.put("has_girlfriend",false); // 使用nullObject跳過編譯器檢查 wangxiaoer.put("car",nullObject); wangxiaoer.put("house",nullObject); wangxiaoer.put("comment","這是一個註釋"); // 經過 JSONObject 的構造函數接收一個 Map 生成 JSON System.out.println(new JSONObject(wangxiaoer).toString()); }
代碼演示:
1.構建JavaBean
package com.myimooc.json.model; import java.util.Arrays; /** * Created by ChangComputer on 2017/5/21. */ public class Diaosi { private String name; private String school; private boolean has_girlfriend; private double age; private Object car; private Object house; private String[] major; private String comment; private String birthday; // 使用 transient 關鍵字,生成 JSON 時忽略該字段 private transient String ignore; public String getIgnore() { return ignore; } public void setIgnore(String ignore) { this.ignore = ignore; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public boolean isHas_girlfriend() { return has_girlfriend; } public void setHas_girlfriend(boolean has_girlfriend) { this.has_girlfriend = has_girlfriend; } public double getAge() { return age; } public void setAge(double age) { this.age = age; } public Object getCar() { return car; } public void setCar(Object car) { this.car = car; } public Object getHouse() { return house; } public void setHouse(Object house) { this.house = house; } public String[] getMajor() { return major; } public void setMajor(String[] major) { this.major = major; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } @Override public String toString() { return "Diaosi{" + "name='" + name + '\'' + ", school='" + school + '\'' + ", has_girlfriend=" + has_girlfriend + ", age=" + age + ", car=" + car + ", house=" + house + ", major=" + Arrays.toString(major) + ", comment='" + comment + '\'' + ", birthday='" + birthday + '\'' + ", ignore='" + ignore + '\'' + '}'; } }
2.編寫構建代碼
/** * 經過 JavaBean 生成JSON【推薦使用】 */ public static void createJsonByBean(){ Diaosi wangxiaoer = new Diaosi(); wangxiaoer.setName("王小二"); wangxiaoer.setAge(25.2); wangxiaoer.setBirthday("1990-01-01"); wangxiaoer.setSchool("藍翔"); wangxiaoer.setMajor(new String[]{"理髮","挖掘機"}); wangxiaoer.setHas_girlfriend(false); wangxiaoer.setCar(null); wangxiaoer.setHouse(null); wangxiaoer.setComment("這是一個註釋"); // 經過 JSONObject 的構造函數接收一個 Bean 生成 JSON System.out.println(new JSONObject(wangxiaoer).toString()); }
代碼演示:
1.添加common-io依賴
// https://mvnrepository.com/artifact/commons-io/commons-io compile group: 'commons-io', name: 'commons-io', version: '2.5'
2.準備JSON數據文件
{ "name" : "王小二", "age" : 25.2, "birthday" : "1990-01-01", "school" : "藍翔", "major" : ["理髮","挖掘機"], "has_girlfriend" : false, "car" : null, "house" : null, "comment" : "這是一個註釋" }
3.編寫讀取代碼
package com.myimooc.json.demo; import org.apache.commons.io.FileUtils; import org.json.JSONArray; import org.json.JSONObject; import java.io.File; import java.io.IOException; /** * 讀取 JSON 數據演示類 * Created by ChangComputer on 2017/5/21. */ public class ReadJsonSample { public static void main(String[] args) throws IOException { createJsonByFile(); } /** * 讀取 JSON 數據 * */ public static void createJsonByFile() throws IOException { File file = new File(ReadJsonSample.class.getResource("/wangxiaoer.json").getFile()); String content = FileUtils.readFileToString(file,"UTF-8"); JSONObject jsonObject = new JSONObject(content); System.out.println("姓名:"+jsonObject.getString("name")); System.out.println("年齡:"+jsonObject.getDouble("age")); System.out.println("有沒有女友?:"+jsonObject.getBoolean("has_girlfriend")); JSONArray majorArray = jsonObject.getJSONArray("major"); for (int i = 0 ; i < majorArray.length(); i++) { System.out.println("專業"+(i+1)+":"+majorArray.get(i)); } // 判斷屬性的值是否爲空 if(!jsonObject.isNull("nickname")){ System.out.println("暱稱:"+jsonObject.getDouble("nickname")); } } }
代碼演示:
// 判斷屬性的值是否爲空 if(!jsonObject.isNull("nickname")){ System.out.println("暱稱:"+jsonObject.getDouble("nickname")); }
本章總結
講解了如何生成JSON格式數據 講解了如何解析JSONObject
開源地址
https://github.com/google/gson
GSON優勢
功能更增強大 性能更加出色 使用方式更加便捷和簡單
代碼演示:
1.添加依賴
// https://mvnrepository.com/artifact/com.google.code.gson/gson compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
2.編寫代碼
package com.myimooc.json.gson; import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.myimooc.json.model.Diaosi; import java.lang.reflect.Field; /** * 使用 GSON 進行 JSON 相關操做 * Created by ChangComputer on 2017/5/21. */ public class GsonCreateSample { public static void main(String[] args) { createJsonByGsonBean(); } /** * * 經過 JavaBean 生成JSON【推薦使用】 */ private static void createJsonByGsonBean() { Diaosi wangxiaoer = new Diaosi(); wangxiaoer.setName("王小二"); wangxiaoer.setAge(25.2); wangxiaoer.setBirthday("1990-01-01"); wangxiaoer.setSchool("藍翔"); wangxiaoer.setMajor(new String[]{"理髮","挖掘機"}); wangxiaoer.setHas_girlfriend(false); wangxiaoer.setCar(null); wangxiaoer.setHouse(null); wangxiaoer.setComment("這是一個註釋"); wangxiaoer.setIgnore("不要看見我"); GsonBuilder gsonBuilder = new GsonBuilder(); // 設置格式化輸出 gsonBuilder.setPrettyPrinting(); // 自定義轉換策略 gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field f) { if(f.getName().equals("name")){ return "NAME"; } return f.getName(); } }); // 生成Gson Gson gson = gsonBuilder.create(); System.out.println(gson.toJson(wangxiaoer)); } }
代碼演示:
package com.myimooc.json.gson; import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.myimooc.json.model.Diaosi; import java.lang.reflect.Field; /** * 使用 GSON 進行 JSON 相關操做 * Created by ChangComputer on 2017/5/21. */ public class GsonCreateSample { public static void main(String[] args) { createJsonByGsonBean(); } /** * * 經過 JavaBean 生成JSON【推薦使用】 */ private static void createJsonByGsonBean() { Diaosi wangxiaoer = new Diaosi(); wangxiaoer.setName("王小二"); wangxiaoer.setAge(25.2); wangxiaoer.setBirthday("1990-01-01"); wangxiaoer.setSchool("藍翔"); wangxiaoer.setMajor(new String[]{"理髮","挖掘機"}); wangxiaoer.setHas_girlfriend(false); wangxiaoer.setCar(null); wangxiaoer.setHouse(null); wangxiaoer.setComment("這是一個註釋"); wangxiaoer.setIgnore("不要看見我"); GsonBuilder gsonBuilder = new GsonBuilder(); // 設置格式化輸出 gsonBuilder.setPrettyPrinting(); // 自定義轉換策略 gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field f) { if(f.getName().equals("name")){ return "NAME"; } return f.getName(); } }); // 生成Gson Gson gson = gsonBuilder.create(); System.out.println(gson.toJson(wangxiaoer)); } }
代碼演示:
package com.myimooc.json.gson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.myimooc.json.demo.ReadJsonSample; import com.myimooc.json.model.Diaosi; import com.myimooc.json.model.DiaosiWithBirthday; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; /** * 使用Gson解析 JSON 文件 * Created by ChangComputer on 2017/5/21. */ public class GsonReadSample { public static void main(String[] args) throws IOException { createJsonByGsonFile(); } /** * 讀取 JSON 數據 * */ public static void createJsonByGsonFile() throws IOException { File file = new File(GsonReadSample.class.getResource("/wangxiaoer.json").getFile()); String content = FileUtils.readFileToString(file,"UTF-8"); // 無日期轉換 Gson gson = new Gson(); Diaosi wangxiaoer = gson.fromJson(content,Diaosi.class); System.out.println(wangxiaoer.toString()); // 帶日期轉換 Gson gson2 = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); DiaosiWithBirthday wangxiaoer2 = gson2.fromJson(content,DiaosiWithBirthday.class); System.out.println(wangxiaoer2.getBirthday().toString()); // 集合類解析 System.out.println(wangxiaoer2.getMajor()); System.out.println(wangxiaoer2.getMajor().getClass()); } }
代碼演示:
// 帶日期轉換 Gson gson2 = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); DiaosiWithBirthday wangxiaoer2 = gson2.fromJson(content,DiaosiWithBirthday.class); System.out.println(wangxiaoer2.getBirthday().toString());
代碼演示:
// 替換爲集合類 private List<String> major;
GSON會自動解析集合類字段
// 集合類解析 System.out.println(wangxiaoer2.getMajor()); System.out.println(wangxiaoer2.getMajor().getClass());
JSON和GSON
JSON是Android SDK官方的庫 GSON適用於服務端開發 GSON比JSON功能更強大
JSON庫的特色
功能:映射Java Object與json格式數據 1.經過Annotation註解來聲明 2.支持自定義屬性名稱 3.支持包含或排序屬性 4.支持自定義接口本身完成解析或生成過程