json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据。
语法规则
JSONl可以表示一下三种类型的值,
1:简单值、
简单值使用与javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null
字符串必须使用双引号表示,不能使用单引号。数值必须以十进制表示,且不能使用NaN和Infinity
JSON不支持javascript中的特殊值undefined,
对象
对象作为一种发杂的数据类型,表示的是一组有序的键值对,每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
与js对象字面量相比,JSON有3个不同的地方,
1:json没有变量的概念
2:在json中对象的键名必须放在双引号里面,
3:json不是js语句,所以没有末尾的分号,
4:同一个对象中不应该出现两个同名属性
数组
数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组
JSON数组也没有变量和分号,把数组和对象结合起来,可以构成更复杂的数据集合
[注意]数组或对象最后一个成员的后面,不能加逗号
json对象
json之所以流行,是因为可以把json数据结构转化为有用的js对象。
EMACscript5对json进行了规范,定义了全局json;
json有两个方法。stringify()和parse();这两个方法分别JS对象序列化为json字符串和把json字符串解析为原生js的值。
stingify()
JSON.stringify()用于将一个值转化为字符串,该字符串符合JSON格式,并且是可以被JSON.parse()还原。
默认情况下,JSON.stringify()输出的JSON字符串不包括任何空格字符或缩进。
var jsonObj = { "title":"javascript", "group":{ "name":"jia", } }; {}} .stringify(.stringify({}) .stringify({ name: (((()) //""2016-09-20T02:26:38.294Z"" 如果对象的成员是undefined或函数,这个成员会被省略;
如果数组的成员是undefined或函数,则这些值被转成null;
如果对象成员或数组成员中出现NaN或Infinity,则这些值被转换成null
console.log(JSON.stringify({ a: NaN, b: Infinity, c: [ NaN,Infinity] })); //{"a":null,"b":null,"c":[null,null]}JSON.stringify()方法会忽略对象的不可遍历属性;
var obj = {}; Object.defineProperties(obj, { 'foo': { value: 1, enumerable: true }, 'bar': { value: 2, enumerable: false } }); JSON.stringify(obj); // {"foo":1}参数
JSON.stringify();除了要序列js对象外,还可以接受两个参数,这两个参数用于指定不同的方式序列化js对象,第一个参数是过滤器,可以是一个数组,也可以是一个函数,第二个参数是一个选项,表示是否在json字符串中保留缩进,
数组过滤
当stringify()方法的第二个参数是数组时,相当于实现一个过滤器的功能;
过滤器之对对象的第一层属性有效,
var jsonObj = { "title":"javascript", "group":{ "a":1 } }; //{"group":{"a":1}} console.log(JSON.stringify(jsonObj,["group","a"]))var jsonObj = { "title":"javascript", "group":{ "a":1 } }; //{"group":{"a":1}} console{"title":"javascript","group":{"a":1}}过滤器对数组无效
var jsonObj =[1,2]; JSON.stringify(jsonObj,["0"])//"[1,2]"函数参数
stringify()的第二个参数可以是一个函数,传入的函数接收两个参数,属性名歌属性值。
JSON.stringify({a:1,b:2}, function(key, value){ if (typeof value === "number") { value = 2 * value; } return value; }) //"{"a":2,"b":4}"属性名只能是字符串,而在值在并非键值对结构时,键名可以是空字符串
下面代码中,对象o一共会被f函数处理三次。第一次键名为空,键值是整个对象o;第二次键名为a,键值是{b:1};第三次键名为b,键值为1。
JSON.stringify({a: {b: 1}}, function (key, value) { console.log("["+ key +"]:" + value); return value; })