编程
JSON(JavaScript Object Notation)是一种能够被不少语言使用的数据格式,本质上是一个字符串,可是它有本身的语法,这样它就能够被 解析器
转换为编程语言中的元素——简单值、对象、数组。 反过来,编程语言中的元素也能够被 序列化器
转换为 JSON 字符串。
不少编程语言都有针对 JSON 的解析器和序列化器,好比后台 PHP 把一个 PHP 对象 序列化 为一段 JSON 字符串,传递给前台页面的 JavaScript 脚本,而后 JavaScript 将其 解析 为一个 JavaScript 对象。
下文将解答两个问题:
语法:JSON能够表示哪些数据?
解析与序列化:JSON字符串与 JavaScript 数据如何互相转换?
JSON做为数据桥梁,能够表示简单值、对象、数组。
字符串:"hello world"
数值:10086
布尔值:true
null:null
JSON 要求给对象属性加上双引号,并且 JSON对象没有名字,末尾没有分号,由于这不是JavaScript语句:
//这是一个JSON对象 { "name": "Paykan", "age": 27 }
JSON数组和JavaScript数组同样: [25, "Paykan"]
,可是没有名字。能够把JSON数组和JSON对象组合起来:
//这是一个JSON数组 [ { "name": "Paykan", "age": 27, "skill": ["HTML", "CSS", "JavaScript"] }, { "name": "BarneyRoos", "age": 26, "skill": ["JSON", "Ajax", "Vue"] } ]
正由于能够把 JSON 字符串解析为有用的 JavaScript 对象、数组等,因此 JSON 已是 Web 开发中数据交换的事实标准。
JavaScript 简单值和数组是不须要序列化的。JSON 简单值和数组也不须要解析便可在 JavaScript 中使用。
JavaScript 中有个 JSON 对象,专门用来处理 JSON 数据。JSON 对象有两个方法:
序列化器:stringify(),用于把 JavaScript 值转换为 JSON 字符串
解析器:parse(),用于把 JSON 字符串解析为 JavaScript 值
//序列化器的使用 //先定义一个JavaScript对象 var book = { title: "Professional JavaScript", authors: ["Nicholas"], edition: 3, year: 2011 say: function(){ return this.title; } } //开始序列化 var jsonText = JSON.stringify(book); //"{"title":"Professional JavaScript","authors":["Nicholas"],"edition":3,"year":2011}" //注意,内层的双引号确定是通过转义了的 //开始解析 var newBook = JSON.parse(jsonText); //{title: "Professional JavaScript", authors: Array(1), edition: 3, year: 2011}
在序列化 JavaScript 对象的时候,函数和原型对象成员会被忽略,值为 undefined 的属性也会被忽略。
stringify() 函数能够接收另外两个参数来控制序列化工做:过滤器、缩进选项
过滤器用来指定工做方式,你可让 stringify() 函数只转换特定的几个属性、能够规定碰见某个属性的时候作点什么事情,因此过滤器有两种:
数组:用来让 stringify() 函数只转换特定的几个属性
//只转换上文中 book 对象的title和edition属性 var jsonText = JSON.stringify(book, ["title", "edition"]); //"{"title":"Professional JavaScript","edition":3}"
函数:用来规定碰见某个属性的时候作点什么事情
//当碰见title属性时,加上字符串 "3rd edition" //当碰见edition属性时,转换为undefined————不出如今JSON字符串中 var jsonText = JSON.stringify(book, function(key, value){ switch(key){ case "title": return value + "3rd edition"; case "edition": return undefined; default: return value;//注意:不须要处理的属性,必定要显式地返回其值 } }); //"{"title":"Professional JavaScript3rd edition","authors":["Nicholas"],"year":2011}"
在序列化 JavaScript 对象时,还能够保留源代码中的换行和缩进——只须要用一个整数指定缩进几个空格便可:
//第二个参数若是不须要设置,就必须为null var jsonText = JSON.stringify(book, null, 4); /* "{ "title": "Professional JavaScript", "authors": [ "Nicholas" ], "edition": 3, "year": 2011 }" */
和序列化选项同样,在进行 JSON 对象解析时,也能够加上另外的参数来控制函数的工做。parse() 函数接收的第二个参数是一个函数,将在每一个属性上调用:
//如今把上文的jsonText解析成JavaScript对象,解析过程当中加一点控制 var newBook = JSON.parse(jsonText, function(key, value){ if(key === "edition") { return value + "rd"; } else{ return value; //注意:不须要处理的属性,必定要显式地返回其值,须要删除的属性,返回undefined } });
简单值:不能表示 undefined,不须要序列化和解析
数组:和 JavaScript 数组同样,不须要序列化和解析
对象:属性名须要加双括号
JavaScript 对象序列化时能够用过滤器和缩进选项来控制序列化工做。
解析 JSON 对象时能够用解析函数来控制解析工做。