注册 登录

清河洛

javascript中JSON的语法和解析及序列化

qingheluo2016-12-16清河洛273
对于XML的结构化数据,开发人员觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON的结构化数据出现了JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据JSON和XML类型,都是一种结构化的数据表示方式,所以,JSON并不是JavaScript独有的数据格式,其他很多语言都可以对JSON进行解析和序列化一.JSON语法JSON的语法可以表示三种类型的值:1.简单值:可以在JSON中表示字符串、数值、布尔值和null(JSON不支持JavaScript中的特殊值undefined)。2.对象JavaScript对象字面量表示...

对于XML的结构化数据,开发人员觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON的结构化数据出现了

JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据

JSON和XML类型,都是一种结构化的数据表示方式,所以,JSON并不是JavaScript独有的数据格式,其他很多语言都可以对JSON进行解析和序列化

一.JSON语法

JSON的语法可以表示三种类型的值:

1.简单值:可以在JSON中表示字符串、数值、布尔值和null(JSON不支持JavaScript中的特殊值undefined)。

2.对象

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

而JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号:
{"name" : "Lee","age" : 100}//使用双引号,否则转换会出错

3.数组:

JavaScript数组字面量表示法:
var box = [100, 'Lee', true];

而JSON中的数组表示法同样没有变量赋值和分号,并且需要用双引号:
[100, "Lee", true]

一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串,但由于获取的数据是字符串,获取以后的使用中需要把字符串转换成JavaScript对象或数组。

二.解析和序列化

如果是载入的JSON文件,我们需要对其进行使用,那么就必须对JSON字符串解析成原生的JavaScript值

当然,如果是原生的JavaScript对象或数组,也可以转换成JSON字符串

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

ECMAScript5对解析JSON的行为进行规范,定义了全局对象JSON

JSON对象提供了两个方法:

一个是将原生JavaScript值转换为JSON字符串:stringify()

另一个是将JSON字符串转换为JavaScript原生值:parse()

var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; //特别注意,键要用双引号,以表示该数据类型是字符串类型
var json = JSON.parse(box); //box如果不是字符串类型,会报错
alert(json);
var box = [{name : 'a', age : 1},{name : 'b', age : 2}]; //JavaScript原生值
var json = JSON.stringify(box); //转换成JSON字符串
alert(json); //自动双引号

序列化JSON的过程中,stringify()方法还提供了二个参数

第一个参数可以是一个数组,也可以是一个函数,用于过滤结果。
第二个参数则表示是否在JSON字符串中保留缩进
    如果该值为一个数值,表示下级相对上级换行并缩进几个字符
    如果该值为一个字符串,表示下级相对上级换行并缩进字符串的长度,缩进前面的空白处用该字符串填充

var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, ['name', 'age'], 4); //第二个参数数组中没有写height,则结果中过滤该属性和值
alert(json);

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

var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, function (key, value) {
    switch (key) {
        case 'name' :
            return 'Mr. ' + value;
        case 'age' :
            return value + '岁';
        default :
            return value;
    }
}, 4);
alert(json);

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

var box = [{name : 'a', age : 1, height : 177, toJSON : function () {return this.name;}},{name : 'b',age : 2, height : 188, toJSON : function () {return this.name;}}];
var json = JSON.stringify(box);
alert(json); //返回字符串["a","b"]

由此可见序列化也有执行顺序

首先先执行toJSON()方法;

然后如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,如将键值对组成合法的JSON字符串,比如加上双引号

如果提供了缩进,再执行缩进操作

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

var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
var json = JSON.parse(box, function (key, value) {
    if (key == 'name') {
        return 'Mr. ' + value;
    } else {
        return value;
    }
});
alert(json[0].name);


网址导航