JSON在JS中的应用

一、 JSONJS中的应用:

首先解释下JSON对象与普通js对象字面量定义时格式的区别:

Js对象字面量定义格式:

var person = {

            name:"Wede",

            age:29

        };

或者:

var person = {

            "name":"Wede",

            "age":29

        };

JSON对象的定义格式:

{

            "name":"Wede",

            "age":29

         }

从定义的语法格式上,可归纳区别有三:

1、 JSON对象定义不需要声明变量。

2、 JSON对象的属性名必须加双引号(属性值不一定加);而js对象字面量属性名双引号可加可不加。

3、 JSON对象定义时末尾没有分号。

 

浏览器对JSON的支持

早期的JSON解析器基本上就是使用JavaScripteval()函数。由于JSONJavaScript语法的子集,因此eval()函数可以解析、解释并返回JavaScript对象和数组。然而在旧版本的浏览器中,使用eval()JSON解析存在着风险,可能会执行一些恶意代码。

后来,ECMAScript 5对解析JSON的行为进行了规范,定义了全局对象JSON。该全局对象有两个方法用于操作JSON字符串js对象之间的转换:stringify()parse()

支持这个全局对象的浏览器有IE8+Firefox 3.5+Safari 4+ChromeOpera 10.5+。而对于不能原生态支持这个全局对象的老浏览器来说,有一个选择让它们可以获得对这个全局对象的支持,那就是使用一个shim:https://github.com/douglascrockford/JSON-js

 

实例演示

//定义一个js对象字面量

var o = {

    name: "Wede.Zhao",

    birth: new Date("1984-11-29"),

    legs: [1,2,3,4],

    year: 2016

}

//使用JSON.stringifyjs对象转换为JSON字符串

var jsonStr = JSON.stringify(o);

 

运行结果:

"{"name":"Wede.Zhao","birth":"1984-11-29T00:00:00.000Z","legs":[1,2,3,4],"year":2016}"

 

//JSON字符串转换为js对象

var jsObj=JSON.parse(jsonStr);

 

运行结果:

Object {name: "Wede.Zhao", birth: "1984-11-29T00:00:00.000Z", legs: Array[4], year: 2016}

 

注意,这里涉及到一个类型转换的问题:birth属性的值本为日期类型的,现在被转换成了字符串格式,比如原来的对象应该是这样的:

Object {name: "Wede.Zhao", birth: Thu Nov 29 1984 08:00:00 GMT+0800 (中国标准时间), legs: Array[4], year: 2016}

而实际却是这样的:

Object {name: "Wede.Zhao", birth: "1984-11-29T00:00:00.000Z", legs: Array[4], year: 2016}

这样一来,我们将无法调用js对象的birth的日期类方法(比如getFullYear()),这就可能偏离了我们的初衷。

 

那么,为了解决这样的问题,我们需要启用JSON.parse方法的第二个参数,在将JSON字符串转换为js对象的过程中,通过一个匿名函数对JSON的每个键值对进行操作,如下:

var oCopy = JSON.parse(jsonStr, function (key, value) {

    if (key == "birth") {

        return new Date(value);

    }

    else {

        return value;

    }

})

 

运行结果:

Object {name: "Wede.Zhao", birth: Thu Nov 29 1984 08:00:00 GMT+0800 (中国标准时间), legs: Array[4], year: 2016}

 

注:JSON.stringify也有同样的功能,用于在将一个js对象转为JSON字符串时对js对象的每个键值对进行操作(还可以对生成结果进行过滤)得到想要的结果。此外,JSON.stringify方法的第三个参数还可以指定是否在生成的JSON字符串中支持缩进。

 

自定义序列化需求

有时候,JSON.stringify()方法默认的序列化方式不能满足对某些对象序列化的需求,这时候我们就可以同构给js对象定义toJSON()方法来重新制定转换规则,从而得到我们想要的结果。如下:

var o = {

    name: "Wede.Zhao",

    birth: new Date("1984-11-29"),

    legs: [1, 2, 3, 4],

    year: 2016,

    toJSON: function () {

        return this.name + " " + this.birth;

    }

}

var mySpecialJsonStr = JSON.stringify(o);   

 

运行结果:

""Wede.Zhao Thu Nov 29 1984 08:00:00 GMT+0800 (中国标准时间)""

posted @ 2018-10-08 14:57  skybirdzw  阅读(1105)  评论(0编辑  收藏  举报