JSON

2018-03-04大约10分钟

JavaScript Object Notation(JSON)是一种格式用来序列化对象、数组、数值、字符串、布尔值和 null 。JSON是如今一种很流行的格式,其他常见的格式有XML,YAML,ProtoBuf等。

序列化/反序列化

简单来说,程序运行时,内存中的对象通常都是二进制的格式,但为了能够把这些对象保存到磁盘、数据库或传递给其他的程序使用,就需要先转换成一种通用的格式。

把对象转成指定的格式,称之为序列化;反之,把数据转换成程序的对象,就是反序列化。

JavaScript里面,也提供了序列化和反序列话的原生方法。

  • JSON.stringify() : 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串
  • JSON.parse() :方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。

后面将对这两个序列化函数做介绍。

JSON.stringify()

JSON.stringify(value) : 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串。

序列化一个空对象:

const jsonValue = JSON.stringify({}); 
console.log(`JSON value: ${jsonValue}`);

序列化布尔值:

const jsonValue = JSON.stringify(true); 
console.log(`JSON value: ${jsonValue}`);

序列化字符串:

const jsonValue = JSON.stringify("Hello"); 
console.log(`JSON value: ${jsonValue}`);

序列化数组:

const jsonValue = JSON.stringify([1, "false", false]); 
console.log(`JSON value: ${jsonValue}`);

序列化普通对象:

const user = { name: "张三", age: 15 }; 
const jsonValue =  JSON.stringify(user);
console.log(`JSON value: ${jsonValue}`);

JSON.stringify(value, replacer, space)还有两个非必需的参数:replacer和space,可以用来对序列化的结果做一些定制,用到的时候,可以再详查文档。

JSON.parse()

JSON.parse() :方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。

const user = JSON.parse('{"name":"张三","age":15}');
console.log(`Name: ${user.name}`);
console.log(`Age: ${user.age}`);

对于parse更多的类型:

JSON.parse('{}');                      // {}
JSON.parse('true');                 // true
JSON.parse('"foo"');               // "foo"
JSON.parse('[1, 5, "false"]');   // [1, 5, "false"]
JSON.parse('null');                 // null
JSON.parse('1');                     //  1

JavaScript 与 JSON 的区别

从JavaScript Object Notation这个字面来理解,很容易认为JSON是基于JavaScript的对象的表示语法的,那么这个语法就应该是JavaScript语言的一部分。

实际上呢,它基于 JavaScript 语法,但与之不同:JavaScript不是JSON,JSON也不是JavaScript 。参考:JSON:不是JavaScript 的子集

JavaScript类型 JSON 区别
对象和数组 属性名称必须是双引号字符串;最后一个属性后不能有逗号。
数值 前导零是禁止的(在 JSON.stringify 零将被忽略,但在 JSON.parse 它将抛出 SyntaxError);小数点后必须至少有一位数字。
字符串 只有有限的一些字符可能会被转义;禁止某些控制字符;字符串必须是双引号;等等。