JSON是一種表示結構化數據的存儲格式,語法格式上與JavasScript對象有些相似。json
TIPS: 與JavaScript對象的格式區別數組
// JSON對象 { "name": "KenTsang", "age": 27, "job": "Developer" } // js對象(該對象將做在後續例子引用) let person = { name: 'KenTsang', age: 27, job: 'Developer' }
ES5定義了一個全局對象JSON,IE8+以上支持,該對象提供來stringify
和parse
兩個方法用於JSON數據解析和序列化。函數
stringify用於把JavaScript對象序列化JSON字符串,spa
在序列化JavaScript對象時,全部函數及原型成員都會被有意忽略,不體如今結果中。此外,值爲undefined的任何屬性也都會被跳過。
JSON.stringify( value: Object, replace: Array | function(key,value) {}, space: number | string )
該方法接受三個參數設計
TIPS1: 過濾器是一個數組時,序列化結果只包含數組中列出的屬性code
let result = JSON.stringify(person, ["name", "job"]); // 輸出結果 // {"name":"KenTsang","job":"Developer"}
TIPS2: 過濾器是一個函數時(替換函數)對象
var jsonStr = JSON.stringify(Person, function(key, value){ if (key == 'age') { return 'secret'; } else { return value; } }) // 輸出結果 // {"name":"KenTsang","age":"secret","job":"Developer"}
若是替換函數返回的是undefined
,則該屬性不會被包含在序列化結果中。blog
用於控制序列化結果中的縮進和空白符,輸出序列結果帶縮進格式,方便預覽查看。實際應用開發很少。ip
let result = JSON.stringify(person, null, '--'); // 輸出結果 /* { --"name": "KenTsang", --"age": 27, --"job": "Developer" } */
應對更復雜的一些需求,咱們能夠經過toJSON()對某些對象進行自定義序列化的需求。開發
let person = { name: "KenTsang", age: 27, job: 'Developer', toJSON: function() { return { "name": "KT", "age": "2*", "job": "DP" } } }; let result = JSON.stringify(person); // 輸出結果 // {"name":"KT","age":"2*","job":"DP"}
TIPS: 序列化順序
- 若是存着toJSON方法並且能經過它取得有效的值,則調用該方法。不然,返回對象自己。
- 若是提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第(1)步的值。
- 對第(2)步返回的每一個值進行相應的序列化。
- 若是提供了第三個參數,執行相應的格式化。
-- 摘自《JavaScript高級程序設計》--
parse用於把JSON字符串解析成JavaScript對象
JSON.parse(text: string, reviver: function(key, value) {})
該方法接受三個參數
let Person = { name: "KenTsang", age: 27, job: "Developer", birth: new Date(1991, 3, 19) }; var jsonStr = JSON.stringify(Person); var jsObj = JSON.parse(jsonStr, function(key, value) { if (key == 'birth') { return new Date(value); } else { return value); } }); jsObj.birth.getFullYearh(); // 輸出結果: 1991
例子中經過還原函數,從新實例一個Date對象,因此能夠用到getFullYear()
方法。
參考文檔
做者:以樂之名 本文原創,有不當的地方歡迎指出。轉載請指明出處。