JSON

本节目标:

1.JSON语法

2.解析和序列化

JSON同XML一样,都是结构化数据,XML数据结构过于烦琐、冗长,JSON的结构化数据相对简单容易操作。JSONJavaScript的一个严格的子集,利用 JavaScript中的一些模式来表示结构化数据 。

JSON语法

JSONXML类型,都是一种结构化的数据表示方式。所以, JSON并不是 JavaScript独有的数据格式,其他很多语言都可以对 JSON进行解析和序列化。
JSON的语法可以表示三种类型的值:
1.简单值:可以在 JSON中表示字符串、数值、布尔值和 null。但 JSON不支持 JavaScript中的特殊值 undefined
2.对象:顾名思义。

3.数组:顾名思义

简单值

100"devin" 这两个量就是 JSON的表示方法,一个是 JSON数值,一个是 JSON字符串。布尔值和 null也是有效的形式。但实际运用中要结合对象或数组。

对象

JavaScript对象字面量表示法:
var box = {
name:'devin',
age:20
};

JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号 :

'{"name":"devin","age":20}'

JSON说白了就是一个字符串,

数组

javaScript数组字面量表示方法:

var box = [100,'Devin',true];

JSON中的数组表示方法:

[100,'Devin',true]

最常用的一种形式是数组结合对象的形式 :

[
{
"title":"a",
"num":1
},
{
"title":"b",
"num":2
},
{
"title":"c",
"num":3
}

]

一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串 。

解析和序列化

如果是载入的JSON文件, 我们需要对其进行使用, 那么就必须对JSON字符串解析成原生的JavaScript值。当然,如果是原生的 JavaScript对象或数组,也可以转换成JSON字符串。

JSON解析

对于将JSON字符串解析为JavaScript原生值,早期采用的是eval()函数。但这种方法既不安全,可能会执行一些恶意代码 。

var box = '[{"title":"a","num":1},{"title":"b","num":2},{"title":"c","num":3}]';
var json = eval(box);

alert(json[0].title)

结果运行:a

ECMAScript5 对解析 JSON 的行为进行规范, 定义了全局对象 JSON 。 支持这个对象的浏览器有 IE8+ Firefox3.5+ Safari4+ Chrome Opera10.5+ 。 不支持的浏览器也可以通过一个开源库 json.js 来模拟执行。 JSON 对象提供了两个方法,一个是将原生 JavaScript 值转换为 JSON 字符串: stringify() ; 另一个是将 JSON 字符串转换为 JavaScript 原生值: parse() .
var box = '[{"title":"a","num":1},{"title":"b","num":2},{"title":"c","num":3}]';//特别注意,键要使用双引号
var json = JSON. parse(box);

alert(json[0].title)

结果运行:a

解析JSON 字符串方法 parse()也可以接受第二个参数, 这样可以在还原出 JavaScript值的时候替换成自己想要的值 。

var box = '[{"title":"a","num":1},{"title":"b","num":2},{"title":"c","num":3}]';
var json = JSON.parse(box,function(key,value){
if(key=='title'){
return "name:"+value;
}else{
return value;
}
});

alert(json[0].title)

结果运行:name:a

序列化JSON

JavaScript原生值解析为JSON字符串

var box = [{title:'a',num:1},{title:'b',num:2},{title:'c',num:3}];
var json = JSON.stringify(box);
alert(json);

结果运行:[{"title":"a","num":1},{"title":"b","num":2},{"title":"c","num":3}]

stringify()方法还提供了第二个参数。第一个参数可以是一个数组, 也可以是一个函数, 用于过滤结果。 第二个参数则表示是否在JSON字符串中保留缩进 。
var box = [{title:'a',num:1},{title:'b',num:2},{title:'c',num:3}];
var json = JSON.stringify(box,['title']);

alert(json);

结果运行:[{"title":"a"},{"title":"b"},{"title":"c"}]

var box = [{title:'a',num:1},{title:'b',num:2},{title:'c',num:3}];
var json = JSON.stringify(box,['title'],4);

alert(json);

结果运行:

[
 {
"title":"a"
 },
 {
"title":"b"
 },
 {
"title":"c"
 }

]

如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为null。如果采用函数,可以进行复杂的过滤 。

var box = [{title:'a',num:1},{title:'b',num:2},{title:'c',num:3}];
var json = JSON.stringify(box,null,4);
alert(json);

结果运行:

[
 {
"title":"a",
"num":1
 },
 {
"title":"b",
"num":2
 },
 {
"title":"c"
"num":3
 }
]

var box = [{title:'a',num:1},{title:'b',num:2},{title:'c',num:3}];
var json = JSON.stringify(box,function(key,value){
if(key=='title'){
return "name-" + value;
}else{
return value;
}
});

alert(json);

运行结果:

[{"title":"name-a","num":1},{"title":"name-b","num":2},{"title":"name-c","num":3}]

有一种方法可以自定义过滤一些数据,使用toJSON()方法,可以将某一组对象里指定返回某个值 。

var box = [
{
title:'a',
num:1,
toJSON:function(){
return this.title;}
},
{
title:'b',
num:2,
toJSON:function(){
return this.title;
}
},
{
title:'c',
num:3,
toJSON:function(){
return this.title
}
}
];
var json = JSON.stringify(box);
alert(json);

结果返回:

["a","b","c"]

序列化也有执行顺序,首先先执行 toJSON() 方法;如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,比如将键值对组成合法的 JSON 字符串,比如加上双引号。如果提供了缩进,再执行缩进操作 。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值