編程
JSON(JavaScript Object Notation)是一種能夠被不少語言使用的數據格式,本質上是一個字符串,可是它有本身的語法,這樣它就能夠被 解析器
轉換爲編程語言中的元素——簡單值、對象、數組。 反過來,編程語言中的元素也能夠被 序列化器
轉換爲 JSON 字符串。
不少編程語言都有針對 JSON 的解析器和序列化器,好比後臺 PHP 把一個 PHP 對象 序列化 爲一段 JSON 字符串,傳遞給前臺頁面的 JavaScript 腳本,而後 JavaScript 將其 解析 爲一個 JavaScript 對象。
下文將解答兩個問題:
語法:JSON能夠表示哪些數據?
解析與序列化:JSON字符串與 JavaScript 數據如何互相轉換?
JSON做爲數據橋樑,能夠表示簡單值、對象、數組。
字符串:"hello world"
數值:10086
布爾值:true
null:null
JSON 要求給對象屬性加上雙引號,並且 JSON對象沒有名字,末尾沒有分號,由於這不是JavaScript語句:
//這是一個JSON對象 { "name": "Paykan", "age": 27 }
JSON數組和JavaScript數組同樣: [25, "Paykan"]
,可是沒有名字。能夠把JSON數組和JSON對象組合起來:
//這是一個JSON數組 [ { "name": "Paykan", "age": 27, "skill": ["HTML", "CSS", "JavaScript"] }, { "name": "BarneyRoos", "age": 26, "skill": ["JSON", "Ajax", "Vue"] } ]
正由於能夠把 JSON 字符串解析爲有用的 JavaScript 對象、數組等,因此 JSON 已是 Web 開發中數據交換的事實標準。
JavaScript 簡單值和數組是不須要序列化的。JSON 簡單值和數組也不須要解析便可在 JavaScript 中使用。
JavaScript 中有個 JSON 對象,專門用來處理 JSON 數據。JSON 對象有兩個方法:
序列化器:stringify(),用於把 JavaScript 值轉換爲 JSON 字符串
解析器:parse(),用於把 JSON 字符串解析爲 JavaScript 值
//序列化器的使用 //先定義一個JavaScript對象 var book = { title: "Professional JavaScript", authors: ["Nicholas"], edition: 3, year: 2011 say: function(){ return this.title; } } //開始序列化 var jsonText = JSON.stringify(book); //"{"title":"Professional JavaScript","authors":["Nicholas"],"edition":3,"year":2011}" //注意,內層的雙引號確定是通過轉義了的 //開始解析 var newBook = JSON.parse(jsonText); //{title: "Professional JavaScript", authors: Array(1), edition: 3, year: 2011}
在序列化 JavaScript 對象的時候,函數和原型對象成員會被忽略,值爲 undefined 的屬性也會被忽略。
stringify() 函數能夠接收另外兩個參數來控制序列化工做:過濾器、縮進選項
過濾器用來指定工做方式,你可讓 stringify() 函數只轉換特定的幾個屬性、能夠規定碰見某個屬性的時候作點什麼事情,因此過濾器有兩種:
數組:用來讓 stringify() 函數只轉換特定的幾個屬性
//只轉換上文中 book 對象的title和edition屬性 var jsonText = JSON.stringify(book, ["title", "edition"]); //"{"title":"Professional JavaScript","edition":3}"
函數:用來規定碰見某個屬性的時候作點什麼事情
//當碰見title屬性時,加上字符串 "3rd edition" //當碰見edition屬性時,轉換爲undefined————不出如今JSON字符串中 var jsonText = JSON.stringify(book, function(key, value){ switch(key){ case "title": return value + "3rd edition"; case "edition": return undefined; default: return value;//注意:不須要處理的屬性,必定要顯式地返回其值 } }); //"{"title":"Professional JavaScript3rd edition","authors":["Nicholas"],"year":2011}"
在序列化 JavaScript 對象時,還能夠保留源代碼中的換行和縮進——只須要用一個整數指定縮進幾個空格便可:
//第二個參數若是不須要設置,就必須爲null var jsonText = JSON.stringify(book, null, 4); /* "{ "title": "Professional JavaScript", "authors": [ "Nicholas" ], "edition": 3, "year": 2011 }" */
和序列化選項同樣,在進行 JSON 對象解析時,也能夠加上另外的參數來控制函數的工做。parse() 函數接收的第二個參數是一個函數,將在每一個屬性上調用:
//如今把上文的jsonText解析成JavaScript對象,解析過程當中加一點控制 var newBook = JSON.parse(jsonText, function(key, value){ if(key === "edition") { return value + "rd"; } else{ return value; //注意:不須要處理的屬性,必定要顯式地返回其值,須要刪除的屬性,返回undefined } });
簡單值:不能表示 undefined,不須要序列化和解析
數組:和 JavaScript 數組同樣,不須要序列化和解析
對象:屬性名須要加雙括號
JavaScript 對象序列化時能夠用過濾器和縮進選項來控制序列化工做。
解析 JSON 對象時能夠用解析函數來控制解析工做。