一、 JSON在JS中的应用:

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

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

支持这个全局对象的浏览器有IE8+、Firefox 3.5+、Safari 4+、Chrome和Opera 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.stringify将js对象转换为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 (中国标准时间)""

JSON在JS中的应用的更多相关文章

  1. MVC中处理Json和JS中处理Json对象

    MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...

  2. 【转】MVC中处理Json和JS中处理Json对象

    事实上,MVC中已经很好的封装了Json,让我们很方便的进行操作,而不像JS中那么复杂了. MVC中: public JsonResult Test() { JsonResult json = new ...

  3. eval()解析json以及js中js数组、对象与json之间的转换

    http://www.cnblogs.com/myjavawork/articles/1979279.html https://www.cnblogs.com/coder-economy/p/6203 ...

  4. php和js中json的编码和解码

    php中 1)编码 $jsonStr = json_encode($array) 2)解码 $arr = json_decode($jsonStr) <?php echo json_encode ...

  5. json字符串返回到js中乱码

    Ajax 的post请求值返回到js中时出现中文乱码的情况,但是在action中写入时并未乱码,解决办法在action中写入前,加上这两行: request.setCharacterEncoding( ...

  6. Js中JSON数据交换使用总结

    Json格式简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是JavaScript原 ...

  7. JS中json数据的处理

    1.  json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组: ...

  8. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  9. 关于JS中的JSON

    早期,一般是使用XML作为互联网上传输结构化数据的,但由于它解析麻烦,字符冗长,因此被轻量级的JSON所逐渐替代.JSON是JavaScript的一个严格子集,利用了JavaScript中一些模式来表 ...

随机推荐

  1. [java]借助java.io.File类,完成文件批量改名

    列出某目录下的所有文件,将文件改名,借助java.io.File一个类就可以完成.大家可以发现,代码中的具体方法都是File一个类的. 另外要注意的是,File的全路径名,路径是一致的,父路径其实是文 ...

  2. web worker 的 self

    A self object, which is the global object representing the worker in this scope. 对self对象的译法,未知妥否. // ...

  3. 014-操作系统下验证下载文件的 MD5/SHA1/SHA256

    一.mac 1.md5 openssl md5 /path/to/file 新的macOS默认支持:md5 filename 2.sha256 openssl dgst -sha256 /path/t ...

  4. tmpfs使用完毕导致数据库无法正常工作

    df -h 查看 重新启动服务器就可以了

  5. swift 第九课 用tableview 做一个下拉菜单Menu

    写到这里的时候,自己这个项目已经完成了一半左右,项目进度自己还是挺满意.今天又有一个新的布局,要实现个下拉菜单,刚开始写的时候,觉得会很容易,后来发现也是小错不断, 我想自己限制的自己属于写博客的初期 ...

  6. swift 第八课 CollectView的 添加 footerView 、headerView

    collectView 也是 iOS 很常用的瀑布流展示控件了,虽然使用过很多次,一直没有系统的总结过,尤其是在添加header 和footer view 的时候,很常见,写起来总觉得不是很流畅,这里 ...

  7. golang web框架设计5:配置设计

    配置信息的解析,实现的是一个key=value,键值对的一个配置文件,类似于ini的配置格式,然后解析这个文件,把解析的数据保存到map中,最后调用的时候通过几个string,int之类的函数返回相应 ...

  8. Day04:循环结构(while、do-while、for)

    Java 循环结构 - while ,do...while,for 反复执行一段相同或相似代码的格式. 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java ...

  9. Windows 7通过VirtualBox配置镜像加速

    配置Docker镜像加速: 1.双击,开启default 2.开启后执行下面的命令修改profile文件: sudo vi /var/lib/boot2docker/profile 打开文件之后,敲下 ...

  10. C\C++中的 struct 关键字详解

    struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体. 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一 ...