最初接触代码就知道序列化与反序列化,但一直没有深入的了解它们,今天就好好的深入梳理下,从头开始
JSON
JavaScript Object Notation
官方的定义是:JSON 是一种存储和交换数据的语法。是通过 JavaScript 对象标记法书写的文本。
其实JSON就是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。
备注 | ||
---|---|---|
构造字符 | [ ] { } : , | 在这六个构造字符的前或后允许存在无意义的空白符 |
字面名 | false、null、true | 必须小写 |
值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个
任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
-
对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, …} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
-
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
JSON 与 JS 对象的关系
通俗的说,JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。如:
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
序列化
即 js 中的 Object 转化为 字符串
1.使用 obj.toJSONString()
var str=obj.toJSONString(); //将JSON对象转化为JSON字符
2.使用JSON.stringify(obj) – 常用
var str=JSON.stringify(obj); //将JSON对象转化为JSON字符
反序列化
即 js 中 JSON 字符串转化为 Object
1.使用eval(‘(’+josnStr+‘)’)
var obj=eval("("+data+")");
为什么要 eval 这里要添加 “(”+data+")” 呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在 JS 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
2.使用jsonStr.parseJSON()
var obj = jsonStr.parseJSON(); //由JSON字符串转换为JSON对象
3.使用parse(jsonStr) – 常用
var obj = JSON.parse(data); //由JSON字符串转换为JSON对象
JSON 和 JS 对象互转
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
使用场景
1.向后台传递参数、接收后台返回值
如果后台返回的是一个 String(Object 序列化后返回),那么需要在 js 中使用 eval 或者 parse 等转化为 Object 再使用;如果返回时传递了类型,比如就是 Object,那么直接使用就好
2.在页面间传递数据,特别是数组时
需要使用序列化,否则IE会报错:不能执行已经释放 Script 的代码
3.在进行本地存储时
存储在本地 window.localStorage.setItem(key,value) 存储的 value 是 json 序列化的字符串;获取得到的 window.localSorage.getItem(key) 也是 json 序列化的字符串,需要经过 json 的反序列化进行使用(常见 json 序列化数组)