json基础用法

JSON格式

JSON格式(JavaScript Object Notation的缩写)是一种用于数据交换的文本格式,2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式。相比XML格式,JSON格式有两个显著的优点:书写简单,一目了然;符合JavaScript原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。简单说,每个JSON对象,就是一个值。要么是简单类型的值,要么是复合类型的值,但是只能是一个值,不能是两个或更多的值。这就是说,每个JSON文档只能包含一个值。

JSON对值的类型和格式有严格的规定。

 1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
 2. 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和 null (不能使用 NaN , Infinity , -Infinity 和 undefined )。
 3. 字符串必须使用双引号表示,不能使用单引号。
 4. 对象的键名必须放在双引号里面。
 5. 数组或对象最后一个成员的后面,不能加逗号。

以下是合格的JSON值。合格的格式!

json基础用法_第1张图片

输出之后:

json基础用法_第2张图片

以下是不合格的JSON值。

json基础用法_第3张图片

 

需要注意的是,空数组和空对象都是合格的JSON值, null 本身也是一个合格JSON值。

 
 
ES5 新增了 JSON 对象,用来处理 JSON 格式数据。它有两个方 法: JSON.stringify() JSON.parse()

JSON.stringify()
基本用法
 
 
JSON.stringify 方法用于将一个值转为字符串。该字符串应该符合 JSON 格式,并且
 
 
可以被 JSON.parse 方法还原。
json基础用法_第4张图片

json基础用法_第5张图片

 

   上面代码将各种类型的值,转成JSON字符串。需要注意的是,对于原始类型的字符串,转换结果会带双引号,即字符串 abc 会被转成 "abc" ,这是因为将来还原的时候,双引号可以让JavaScript引擎知道, abc 是一个字符串,而不是一个变量名。如果原始对象中,有一个成员的值是 undefined 、函数或XML对象,这个成员会被省略。如果数组的成员是 undefined 、函数或XML对象,则这些值被转成 null

json基础用法_第6张图片

 

 

 上面代码中,原始对象的 f 属性是一个函数, JSON.stringify 方法返回的字符串会将这个属性省略。而 a 属性是一个数组,成员分别为函数和undefined,它们都被转成null

正则对象会被转成空对象。
json基础用法_第7张图片

 

 

JSON.stringify 方法会忽略对象的不可遍历属性。
json基础用法_第8张图片

 

 上面代码中, bar obj 对象的不可遍历属性, JSON.stringify 方法会忽略这个属性。


 

 第二个参数

JSON.stringify 方法还可以接受一个数组,作为第二个参数,指定需要转成字符串 的属性。
json基础用法_第9张图片

 

 上面代码中, JSON.stringify 方法的第二个参数指定,只转 prop1 prop2 两个属性。

 
 
 
这个类似 白名单 的数组,只对对象的属性有效,对数组无效。
 
 

 json基础用法_第10张图片

 

上面代码中,第二个参数指定JSON格式只转 0 号属性,实际上对数组是无效的,只对对象有效。

 
 
第二个参数还可以是一个函数,用来更改 JSON.stringify 的默认行为。
json基础用法_第11张图片

 

 上面代码中的 f 函数,接受两个参数,分别是被转换的对象的键名和键值。如果键值是数值,就将它乘以 2 ,否则就原样返回。

 
 
注意,这个处理函数是递归处理所有的键。
json基础用法_第12张图片

 

 上面代码中,对象 o 一共会被 f 函数处理三次。第一次键名为空,键值是整个对o ;第二次键名为 a ,键值是 {b: 1} ;第三次键名为 b ,键值为1

 

递归处理中,每一次处理的对象,都是前一次返回的值。
json基础用法_第13张图片

 

 上面代码中, f 函数修改了对象 o ,接着 JSON.stringify 方法就递归处理修改后的对象 o

 

如果处理函数返回 undefined 或没有返回值,则该属性会被忽略。
json基础用法_第14张图片
上面代码中, a 属性经过处理后,返回 undefined ,于是该属性被忽略了。
 

 


 

第三个参数JSON.stringify 还可以接受第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。

json基础用法_第15张图片

 

 


 

toJSON 方法 如果 JSON.stringify 的参数对象有自定义的 toJSON 方法,那么 JSON.stringify 会使用这个方法的返回值作为参数,而忽略原对象的其他属性。

 json基础用法_第16张图片

 

上面代码是 JSON.stringify 方法处理一个正常的对象。
 
现在,为这个对象加上 toJSON 方法。
json基础用法_第17张图片

 

 上面代码中, JSON.stringify 发现参数对象有 toJSON 方法,就直接使用这个方法的返回值作为参数,而忽略原对象的其他参数。

 
Date 对象就有一个自己的 toJSON 方法。

 

 上面代码中, JSON.stringify 一旦发现处理的是 data 对象实例,就会自动调用这个实例对象的 toJSON 方法,将该方法的返回值作为参数。

 

  toJSON 方法的一个应用是,将正则对象自动转为字符串。因为 JSON.stringify 认不能转换正则对象,但是设置了 toJSON 方法以后,就可以转换正则对象了。
  json基础用法_第18张图片
上面代码在正则对象的原型上面部署了 toJSON 方法,将其指向 toString 方法,因此
 
 
遇到转换成 JSON 时,正则对象就先调用 toJSON 方法转为字符串,然后再
 
 
JSON.stingify 方法处理。
 
JSON.parse()
 
 
JSON.parse 方法用于将 JSON 字符串转化成对象。
json基础用法_第19张图片

 

 

  如果传入的字符串不是有效的JSON格式, JSON.parse 方法将报错。

json基础用法_第20张图片

 

 

 上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合JSON

 
 
式,所以报错。
 
为了处理解析错误,可以将 JSON.parse 方法放在 try...catch 代码块中。
JSON.parse 方法可以接受一个处理函数,用法与 JSON.stringify 方法类似。

 json基础用法_第21张图片

 

 

你可能感兴趣的:(json基础用法)