文章目录
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()还可以接受其他参数,这使得程序的序列化操作变得更大。
具体句子规则:
JSON.stringify(value[, replacer[, space]])
参数列表:
以下示例显示了 Replacer 和 space 参数的使用。 本示例优化了发言者对象的显示,同时演示了对数据元素的过滤操作:
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 序列化应该最适合对象。
您可以通过将 toJSON() 添加到扬声器对象来定义 JSON.stringify() 的输出:
let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true
};speaker.toJSON = function() {return 'Hi there!';
};// 序列化
console.log('speaker.toJSON(): ' + JSON.stringify(speaker, null, 2));
如果一个对象有 toJSON 方法,JSON.stringify() 不再尝试将其转换为字符串,而是直接输出该对象的 toJSON() 方法返回的值。 使用 toJSON() 是合法的,但不一定明智。 因为一旦使用toJSON()方法,开发者就必须承担整个对象结构的序列化操作javascript序列化,这完全违背了JSON.stringify()的初衷。 对于像扬声器这样的简单对象来说,可能没有问题,但是对于包含其他对象的复杂对象来说,相关的序列化代码迟早会变得非常复杂。
使用 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);
上例中的text参数包含newDate()的JavaScript语句,eval()执行成功; JSON.parse() 成功拒绝该参数并报告该参数非法的错误。
如果嵌入的句子富含恶意代码,eval()可能会继续执行,eval()会打开一扇允许任何JavaScript表达式介入的侧门,这将使程序更容易受到攻击。 因此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 对象。