JSON对象

一,JSON格式

JSON格式(JavaScript Object Notation的缩写)是一种用于数据交换的文本格式 2001年由Douglas Crockford提出,目的是取代繁华笨重的XML格式。
相比XML格式,JSON格式有两个显著的优点:书写简单,一目了然符合JavaScript原生语法,可以有解释引擎直接处理,不用另外添加解析代码 。
所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入准则。

  • JSON指的是JavaScript对象表示法。
  • JSON比XML更小、更快,更易解析。
  • JSON是轻量级的文本数据交换格式。
  • JSON具有自我描述性,更易理解。

每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或多个。
JSON对值的类型和格式有严格的规定:
1,复合类型的值只能是数组对象,不能是函数、正则表达式对象、日期对象。
2,原始类型的值只有四种:字符串数值(必须以十进制表示)、布尔值null
3,字符串必须使用双引号表示,不能使用单引号。
4,对象的键名必须放在双引号里面。
5,数组或对象最后一个成员的后面,不能加逗号。

二,JSON对象JSON.stringify():

JSON对象是JavaScript的原生对象,用来处理JSON格式数据。它有两个静态方法:JSON.stringify()和JSON.parse()

JSON通常用于与服务端交换数据。
在向服务端发送数据时一般是字符串。
我们可以使用JSON.stringify()方法将JavaScript对象转换为字符串。
语法格式:

JSON.stringify(value[,replacer[,space]])

参数说明:
value: 必需,要转换的JavaScript值(通常为对象或数组)。
replacer: 可选,用于转换结果的函数或数组。( 如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
space: 可选,文本添加缩进、空格、换行符。如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t

JavaScript对象转换:

var obj = { "name":"future", "alexa":10000, "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj);
//myJSON为字符串

JavaScript数组转换:

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ];
var myJSON = JSON.stringify(arr);
//myJSON为字符串

异常:
解析数据:
JSON不能存储Date对象,JSON.stringify()会将所有日期转换为字符串。
解析函数:
JSON不允许包含函数,JSON.stringify()会删除JavaScript对象的函数,包括key和value。(可以在执行JSON.stringify()之前将函数转换为字符串)(不建议在JSON中使用函数)。

第二个参数:
JSON.stringify()方法还可以接受一个数组,作为第二个参数,指定参数对象的哪些属性需要转成字符串。
例:

var obj = {
	'prop1': 'value1',
	'prop2': 'value2',
	'prop3': 'value3'
};
var selectedProperties = ['prop1','prop2'];
JSON.stringify(obj,selectedProperties);
//返回"{"prop1":"value1","prop2":"value2"}"

上面代码中,第二个参数指定只转换prop1和prop2两个属性。(只对对象的属性有效,对数组无效)

第二个参数还可以是一个函数,用来更改JSON.stringify()的返回值。
例:

function f(key,value) {
	if(typeof value === "number") {
		value = 2 * value;
	}
	return value;
};
JSON.stringify({a:1,b:2},f);
//返回 "{"a":2,"b":4}"

这个处理函数是递归处理所有的键。

var obj = {a: 1};
function f(key, value) {
  if (typeof value === 'object') {
    return {b: 2};
  }
  return value * 2;
}
JSON.stringify(obj, f)
//返回 "{"b": 4}"

可以看出函数第一次执行时键名为空键值是整个obj,上述代码,f函数先修改了obj,接着递归处理修改后的对象。

如果处理函数返回undefined或没有返回值,则该属性会被忽略。
第三个参数
JSON.stringify()还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。
默认返回的是单行字符串,对于大型的 JSON 对象,可读性非常差。第三个参数使得每个属性单独占据一行,并且将每个属性前面添加指定的前缀(不超过10个字符)。

// 默认输出
JSON.stringify({ p1: 1, p2: 2 })
// JSON.stringify({ p1: 1, p2: 2 })
// 分行输出
JSON.stringify({ p1: 1, p2: 2 }, null, '\t')
// {
// 	"p1": 1,
// 	"p2": 2
// }

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

三,JSON对象JSON.parse()

JSON.parse()方法用于将 JSON 字符串转换成对应的值。(即将数据转换为JavaScript对象)、
语法格式:

JSON.parse(text[,reviver])

参数说明:
text: 必需,一个有效的JSON字符串。
reriver: 可选,一个转换结果的函数,将为对象的每个成员调用此函数。

解析前要确保数据是标准的JSON格式,否则会解析出错

解析异常同于JSON.stringify() 第二个参数可以是一个处理函数,类似于JSON.stringify()方法