前言
近期的學習與大作業中,發現了Json的重要性,藉此機會記錄下來。
什麼是Json?
Json 是一種輕量級的數據交換的格式類型,是JavaScript對象表示法,應用廣泛。對於後端對象來說,Json 就是一個字符串,比如:
“ hello ” : 這是字符串
hello : 這是對象
Json長什麼樣?
以鍵值對的形式,key 和 value 都需要用雙引號引起來,中間用冒號分隔。
{"name":"張三","age":3,"sex":"男"}
Json和對象的差別
首先我們測試一段 JavaScript的代碼
<script type="text/javascript">
var user = {
name : "張三",
age : 3,
sex : "男"
};
//將js對象轉化成json
var json = JSON.stringify(user);
console.log(json);
console.log(user);
</script>
結果如下:
通過瀏覽器控制檯顯示:
第一行是一 Json
第二行是 對象Object ,是可以展開的
二者的差別: 在對象中,key 沒有雙引號
Json數組
Json 數組給各個 Json 用中括號括起來。
[
{"name":"張三","age":3,"sex":"男"},
{"name":"張三2","age":23,"sex":"男"}
]
Json 的作用
前後端分離時代:
- 後端部署後端,提供接口,提供數據
- 前端獨立部署,負責渲染後端傳來的數據
那問題來了:前後端如何進行交互,數據的傳輸?
這裏用我最近做的安卓應用爲例。
使用的數據接口來源於聚合數據。
Json 返回示例:
{
"error_code": 0, /*返回碼*/
"reason": "請求成功!",
"result": [
{
"day": 1, /*日*/
"des": "1907年11月1日 電影導演吳永剛誕生 吳永剛,1907年11月1日生於江蘇吳縣。1932年後參加影片《三個摩登女性》、《母性之光》的拍攝工作。1934年在聯華影片公司編導處女作《神女》,一舉成名,...", /*描述*/
"id": 9000, /*事件ID*/
"lunar": "丁未年九月廿六",
"month": 11, /*月份*/
"pic": "", /*圖片*/
"title": "電影導演吳永剛誕生", /*事件標題*/
"year": 1907 /*年份*/
},
{
"day": 1,
"des": "1902年11月1日 挪威作家格里格誕生 格里格,1902年11月1日生於卑爾根。挪威作家。 青年時代在奧斯陸和牛津求學,好旅行。1924年出版描寫海員生活的小說《航船在前進》。1926年至1927年在...",
"id": 9010,
"lunar": "壬寅年十月初二",
"month": 11,
"pic": "",
"title": "挪威作家格里格誕生",
"year": 1902
},
{
"day": 1,
"des": "1911年11月1日,清廷宣佈解散皇族內閣,任命袁世凱爲內閣總理大臣,要他趕快從前線回京,籌組“責任內閣”。11月13日,袁世凱抵達北京,16日組織新內閣,以梁郭彥爲外務大臣,趙秉鈞爲民政大臣,...",
"id": 3577,
"lunar": "辛亥年九月十一",
"month": 11,
"pic": "",
"title": "袁世凱出任清朝內閣總理大臣",
"year": 1911
}
]
}
那麼從接口獲得的數據應該怎麼在我的 App 應用上得到應用呢?
- 生成我們的 JavaBean(主要是屬性,其餘是get set 方法)
public class HistoryBean implements Serializable {
private String reason;
private int error_code;
private List<ResultBean> result;
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
public List<ResultBean> getResult() {
return result;
}
public void setResult(List<ResultBean> result) {
this.result = result;
}
public static class ResultBean implements Serializable{
/**
* _id : 16530420
* title : 奧利弗·克倫威爾解散英國國會
* pic : http://juheimg.oss-cn-hangzhou.aliyuncs.com/toh/201004/18/FA235154714.jpg
* year : 1653
* month : 4
* day : 20
* des : 在367年前的今天,1653年4月20日 (農曆三月廿三),奧利弗·克倫威爾解散英國國會。
* lunar : 癸巳年三月廿三
*/
private String _id;
private String title;
private String pic;
private int year;
private int month;
private int day;
private String des;
private String lunar;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getLunar() {
return lunar;
}
public void setLunar(String lunar) {
this.lunar = lunar;
}
}
}
- 其餘操作(Bean只是與json數據進行對應)
Json與對象之間的轉換
工具 : gson、Jackson 等等。
這裏以 spingMVC 中使用Jackson爲例
@RestController
public class UserController {
@RequestMapping(value = "/json1")
public String json1() throws JsonProcessingException {
//創建一個jackson的對象映射器,用來解析數據
ObjectMapper mapper = new ObjectMapper();
//創建一個對象
User user = new User("張三1號", 3, "男");
//將我們的對象解析成爲json格式
String str = mapper.writeValueAsString(user);
//由於@ResponseBody註解,這裏會將str轉成json格式返回;十分方便
return str;
}
}
同理,處理Json數組:
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
//創建一個jackson的對象映射器,用來解析數據
ObjectMapper mapper = new ObjectMapper();
//創建一個對象
User user1 = new User("張三1號", 3, "男");
User user2 = new User("張三2號", 3, "男");
User user3 = new User("張三3號", 3, "男");
User user4 = new User("張三4號", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//將我們的對象解析成爲json格式
String str = mapper.writeValueAsString(list);
return str;
}
JSON 的其他應用領域
1. Web開發
JSON最開始被廣泛的應用於WEB應用的開發。不過目前JSON使用在JavaScript、Java、Node.js應用的情況比較多,PHP、C#等開發的WEB應用主要還是使用XML。
2. NoSQL數據庫
相對於傳統的關係型數據庫,一些基於文檔存儲的NoSQL非關係型數據庫選擇JSON作爲其數據存儲格式,比較出名的產品有:MongoDB、CouchDB、RavenDB等。
- 舉例
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
這種JSON格式也被Minecraft遊戲用來當作的部分數據存儲的格式:
[
{
"text": "This is the text",
"color": "dark_red",
"bold": "true",
"strikethough": "true",
"clickEvent":
{
"action": "open_url",
"value": "zh.wikipedia.org"
},
"hoverEvent":
{
"action": "show_text",
"value":
{
"extra": "something"
}
}
},
{
"translate": "item.dirt.name",
"color": "blue",
"italic": "true"
}
]
3. 安全問題
XML和JSON的區別
JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。這使得XML在程序判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),在數據存儲,擴展及高級檢索方面具備對JSON的優勢,而JSON則由於比XML更加小巧,以及瀏覽器的內建快速解析支持,使得其更適用於網絡數據傳輸領域。