JSON格式数据的定义及操作
SON —— JavaScript Object Notation,JavaScript对象表⽰法。
JSON 是⼀种数据格式,⽽不是⼀种编程语⾔。虽然具有相同的语法形式,但 JSON 并不从属于 JavaScript。⽽且,并不是只有JavaScript 才使⽤ JSON,毕竟 JSON 只是⼀种数据格式。很多编程语⾔都有针对 JSON 的解析器和序列化器。
JSON 的语法可以表⽰以下三种类型的值。
简单值:使⽤与 JavaScript 相同的语法,可以在 JSON 中表⽰字符串、数值、布尔值和 null。但 JSON 不⽀持 JavaScript 中的特殊值undefined。
对象:对象作为⼀种复杂数据类型,表⽰的是⼀组⽆序的键值对⼉。⽽每个键值对⼉中的值可以是简单值,也可以是复杂数据类型的值。 数组:数组也是⼀种复杂数据类型,表⽰⼀组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。
1、在表⽰“简单值”数据形式时, JSON 字符串必须使⽤双引号(单引号会导致语法错误),这是JavaScript 字符串与 JSON 字符串的最⼤区别。
2、在表⽰“对象”数据形式时,与 JavaScript 的对象字⾯量相⽐, JSON 对象有两个地⽅不⼀样。⾸先,没有声明变量(JSON 中没有变量的概念)。其次,没有末尾的分号(因为这不是 JavaScript 语句,所以不需要分号)。在 JSON 中,对象的属性必须加双引号,这是必需的。属性的值可以是简单值,也可以是复杂类型值。
// javaScript 对象字⾯量,属性的双引号可省略
var object = {
"name": "Nicholas",
"age": 29
json值的类型有哪些};
// ⽽⽤JSON格式表⽰上⾯的对象如下
{
"name": "Nicholas",
"age": 29
}
// JSON格式的属性值可以为简单值,也可以为复杂值
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}
3、在表⽰“数组”数据形式时, JSON 数组采⽤的就是 JavaScript 中的数组字⾯量形式。同样要注意, JSON 数组也没有变量和分号。
// 下⾯是 JavaScript 中的数组字⾯量:
var values = [25, "hi", true];
// 在 JSON 中,可以采⽤同样的语法表⽰同⼀个数组:
[25, "hi", true]
把数组和对象结合起来,可以构成更复杂的数据集合,如下:
[
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
"edition": 2,
"year": 2009
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
"edition": 2,
"year": 2008
}
]
对象和数组通常是 JSON 数据结构的最外层形式(当然,这不是强制规定的),利⽤它们能够创造出各种各样的数据结构。
JSON 之所以流⾏,拥有与 JavaScript 类似的语法并不是全部原因。更重要的⼀个原因是,可以把JSON 数据结构解析为有⽤的JavaScript 对象。
相关⽅法:
JSON 对象有两个⽅法: stringify()和 parse()。
JSON.parse()解析: JSON 字符串 => javaScript 对象
JSON.stringify()序列化:javaScript 对象 => JSON 字符串
1、JSON.stringify()序列化
在序列化 JavaScript 对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined 的任何属性也都会被跳过。结果中最终都是值为有效 JSON 数据类型的实例属性。
// JSON.stringify()序列化,把⼀个 JavaScript 对象序列化为⼀个 JSON 字符串
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book);
/* 默认情况下, JSON.stringify()输出的 JSON 字符串不包含任何空格字符或缩进,因此保存在 jsonText 中的字符串如下所⽰:{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}*/
默认情况下, JSON.stringify()输出的 JSON 字符串不包含任何空格字符或缩进。 JSON.stringify()还有第⼆个参数(⽤于过滤要序列化的数据,可以是⼀个数组,也可以是⼀个函数)和第三个参数(定义空格的个数,最多为10;或者使⽤字符来间隔数据)
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
}, 2);
2、JSON.parse()解析
如果传给 JSON.parse()的字符串不是有效的 JSON,该⽅法会抛出错误。
// JSON.parse()解析,把⼀个 JSON 字符串解析为⼀个 JavaScript 对象
var bookCopy = JSON.parse(jsonText);
JSON.parse() 也可以接收第⼆个参数(该参数是⼀个函数,有key和value两个传参),为了区别 JSON.stringify()接收的替换(过滤)函数(replacer),这个函数被称为还原函数(reviver),但实际上这两个函数的签名是相同的——它们都接收两个参数,⼀个键和⼀个值,⽽且都需要返回⼀个值。
如果还原函数返回 undefined,则表⽰要从结果中删除相应的键;如果返回其他值,则将该值插⼊到结果中。
// 在将⽇期字符串转换为 Date 对象时,经常要⽤到该还原函数。
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}
});
console.FullYear());
/* 以上代码先是为 book 对象新增了⼀个 releaseDate 属性,该属性保存着⼀个 Date 对象。这个对象在经过序列化之后变成了有效的JSON 字符串,然后经过解析⼜在 bookCopy 中还原为⼀个 Date对象。还原函数在遇到"releaseDate"键时,会基于相应的值创建⼀个新的 Date 对象。结果就是leaseDate 属性中会保存⼀个 Date 对象。正因为如此,才能基于这个对象调⽤getFullYear()⽅法。*/
在旧版本的浏览器中,使⽤ eval()对 JSON 数据结构求值存在风险,因为可能会执⾏⼀些恶意代码。
对于不能原⽣⽀持 JSON 解析的浏览器,使⽤这个 shim 是最佳选择。
JSON在低版本(IE8以下)中上⾯两个⽅法不能⽤,可以加⼊hack⽅法shim来使⽤。shim
JSON.parse()【从⼀个字符串中解析出json对象】
例⼦:
//定义⼀个字符串
var data='{"name":"goatling"}'
//解析对象
J SON.parse(data)
结果是:
n ame:"goatling"
JSON.stringify()【从⼀个对象中解析出字符串】
var data={name:'goatling'}
JSON.stringify(data)
结果是:
'{"name":"goatling"}'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论