javascript
【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作
文章目錄
- 用于stringfy/parse操作的"JSON"對象
- JavaScript中簡單數據類型的JSON序列化操作
- 使用toJSON()進行對象的序列化操作
- 使用eval()進行JSON的反序列化操作
- 使用JSON.parse()進行JSON的反序列化操作
用于stringfy/parse操作的"JSON"對象
JavaScript中有“JSON”對象,該對象提供以下方法:
- JSON.stringfy():將信息序列化為JSON
- JSON.parse() :將JSON反序列化為JavaScript可理解的數據結構
該對象還具有以下特征:
- 最初由 Douglas Crockford 所開發
- 無法實例化
- 除了stringfy()和parse()以外不提供其他功能
JavaScript中簡單數據類型的JSON序列化操作
來看看JavaScript中下列基礎數據的序列化操作:
- 數值
- 字符串
- 數組
- 布爾值
- 字面量對象
下面的代碼展示了如何使用JSON.stringfy()來序列化簡單數據類型:
let age = 39; // 整數 console.log('age = ' + JSON.stringify(age) + '\n');let fullName = 'LeBron James'; // 字符串 console.log('fullName = ' + JSON.stringify(fullName) + '\n');let tags = ['json', 'rest', 'api', 'oauth']; // 數組 console.log('tags = ' + JSON.stringify(tags) + '\n');let reqistered = true; // 布爾 console.log('registered = ' + JSON.stringify(reqistered) + '\n');let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true };console.log('speaker = ' + JSON.stringify(speaker));上面的代碼可以在安裝Node.js后用node命令在命令行運行。
對于標量類型(數值、字符串、布爾值),JSON.stringify()并沒有提供什么有趣的功能。
但是對于speaker這種對象字面量來說,JSON.stringify()會生成一段駁雜卻合法的JSON字符串,因此顯得比較有用。
JSON.stringify()還可以接受其他參數,從而讓程序序列化操作變得更加強大。
具體語法規則:
參數列表:
- value(必選)
需要進行序列化的JavaScript值。 - replacer(可選)
函數 或者數組。如果是函數,stringify()會為value對象中的每個名稱-值對調用replacer。 - space(可選)
數值或者字符串,表示縮進。如果是數值,則表示每一級縮進所占的空格數。
下面的例子展示了replacer和space參數的使用,該實例優化了speaker對象的顯示,同時也展示了對數據元素的過濾操作:
let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true };function serializeSpeaker(key, value) {return (typeof value === 'string' || Array.isArray(value)) ? undefined : value; }console.log('Speaker (pretty print):\n' + JSON.stringify(speaker, null, 2) + '\n');// 打印并過濾掉字符串和數組 console.log('Speaker without Strings and Arrays:\n' +JSON.stringify(speaker, serializeSpeaker, 2));使用toJSON()進行對象的序列化操作
JSON序列化操作最應該適用于對象。
可以通過向speaker對象中添加toJSON()方法來定義JSON.stringify()的輸出結果:
如果一個對象有toJSON方法,則JSON.stringify()不再試圖將其轉換為字符串,而是直接輸出該對象的toJSON()方法所返回的值。使用toJSON()方法是合法的,但不一定明智。因為一旦使用了toJSON()方法,開發者就必須自行承擔對整個對象結構的序列化操作,而這完全違背了JSON.stringify()的初衷。對于speaker這樣的簡單對象來說,可能沒有什么問題,但對于包含其他對象的復雜對象來說,相關序列化代碼遲早會變得十分復雜。
使用eval()進行JSON的反序列化操作
不推薦!
JavaScript開發者最早是采用eval()函數來解析JSON的。
eval()可以接收一個字符串作為參數。這個字符串可以是一個JavaScript表達式,一句JavaScript語句,或者一連串JavaScript語句。
let x = '{ "sessionDate": "2020-10-06T13:30:00.000Z" }';console.log('Parse with eval(): ' + eval('(' + x + ')').sessionDate + '\n');console.log('Parse with JSON.parse(): ' + JSON.parse(x).sessionDate);上述程序中eval()和JSON.parse()執行結果相同,都解析了日期屬性。請接著看:
let x = '{ "sessionDate": new Date() }';console.log('Parse with eval(): ' + eval('(' + x + ')').sessionDate + '\n');console.log('Parse with JSON.parse(): ' + JSON.parse(x).sessionDate);上述示例的文本參數含有new Date()這一條JavaScript語句,而eval()成功執行了;JSON.parse()則成功拒絕了這一參數并報錯參數非法。
如果嵌入語句中含有惡意代碼,eval()可能也會繼續執行,eval()會打開允許任何JavaScript表達式進入的后門,這會使得程序更易受到攻擊。因此盡管eval()可以用于解析JSON,但一般不安全,也不合適。
JavaScript對JSON的解析廢棄了eval()函數,取而代之的是下面的JSON.parse()。
使用JSON.parse()進行JSON的反序列化操作
// 多行JSON字符串 let json = '{' +'"firstName": "LeBron",' +'"lastName": "James",' +'"email": "lbj@gmail.com",' +'"about": "...",' +'"company": "USA",' +'"tags": [' +'"json",' +'"rest",' +'"api",' +'"oauth"' +'],' +'"registered": true' + '}';// 反序列化 let speaker = JSON.parse(json);console.log('speaker.firstName = ' + speaker.firstName);JSON.parse()接受一個JSON字符串作為輸入,并將其解析為完整的JavaScript對象。
總結
以上是生活随笔為你收集整理的【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】基础数据结构与算法大全
- 下一篇: 详解Spring框架的依赖注入