JSON在JS中的应用
一、 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中的应用的更多相关文章
- MVC中处理Json和JS中处理Json对象
MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...
- 【转】MVC中处理Json和JS中处理Json对象
事实上,MVC中已经很好的封装了Json,让我们很方便的进行操作,而不像JS中那么复杂了. MVC中: public JsonResult Test() { JsonResult json = new ...
- eval()解析json以及js中js数组、对象与json之间的转换
http://www.cnblogs.com/myjavawork/articles/1979279.html https://www.cnblogs.com/coder-economy/p/6203 ...
- php和js中json的编码和解码
php中 1)编码 $jsonStr = json_encode($array) 2)解码 $arr = json_decode($jsonStr) <?php echo json_encode ...
- json字符串返回到js中乱码
Ajax 的post请求值返回到js中时出现中文乱码的情况,但是在action中写入时并未乱码,解决办法在action中写入前,加上这两行: request.setCharacterEncoding( ...
- Js中JSON数据交换使用总结
Json格式简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是JavaScript原 ...
- JS中json数据的处理
1. json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组: ...
- js中eval详解,用Js的eval解析JSON中的注意点
先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...
- 关于JS中的JSON
早期,一般是使用XML作为互联网上传输结构化数据的,但由于它解析麻烦,字符冗长,因此被轻量级的JSON所逐渐替代.JSON是JavaScript的一个严格子集,利用了JavaScript中一些模式来表 ...
随机推荐
- 【如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?】
作为.Net开发人员,其实对IIS的应用程序池知之甚少,前段时间被问到一个问题: 对于互联网web应用,如何在用户毫无感知的情况下回收程序池?(对用户产生最小的影响) 简单理解IIS应用程序池 应用程 ...
- linux 查看网络流量命令
转: linux 查看网络流量命令 2019年01月31日 14:22:00 weixin_33894992 阅读数 893 sar命令参数很多,有时间man一下. -n参数很有用,他有6个不同的 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_22-页面静态化-静态化测试-静态化程序测试
测试service内些的静态化的方法 先新建一个测试类 模板的id 放到下拉的静态数据里面 这样这条数据 就是用用的轮播图005这个模板 把这条数据静态化 进入到断点里面.先获取数据模型 获取模板时 ...
- OpenStack Cinder发展动态系列--Austin峰会
在Mitaka版本,Cinder团队在多个特性和领域取得了重大进展. 本文将做一个简要的介绍:关于在Mitaka版本已经完成的功能和特性,以及讨论在Newton版本将会开发的功能和特性. 1 Cind ...
- [C++]数据结构:栈之顺序栈
0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enu ...
- Windows下Tesseract-OCR的安装
可以去Github查看tesseract-ocr的信息:https://github.com/tesseract-ocr/tesseract 在写这篇随笔的时候(2018年8月21日)最新版本是3.0 ...
- 差分约束算法————洛谷P4878 [USACO05DEC] 布局
题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...
- TOMCAT 安装教程 & 配置CGI & c语言exe
TOMCAT安装 参考原文网址:百度经验http://jingyan.baidu.com/article/154b4631aad2bb28ca8f4191.html 1.下载安装JDK 网址:http ...
- 【并行计算-CUDA开发】 NVIDIA Jetson TX1
概述 NVIDIA Jetson TX1是计算机视觉系统的SoM(system-on-module)解决方案.它组合了最新的NVIDIAMaxwell GPU架构,其具有ARM Cortex-A57 ...
- OpenCV.学习OpenCV.pdf
1.Pdf.P160(书.P129) “表5-1:平滑操作的各总类型” 的列名 看起来很模糊,现在先把尽可能看得清的字记录下来: 平滑类型 名称 支持 No 输入数据类型 输出数据类型 简要说明 2. ...