前两章我们探讨了XML的结构化数据,但开发人员还是觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON的结构化数据出现了。JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据。

 

一.JSON语法

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

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

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

2.对象:顾名思义。

3.数组:顾名思义。

简单值

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

对象

JavaScript对象字面量表示法:

var box = {

name : 'Dkf',

age : 100

};

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

{

"name" : "Dkf", //使用双引号,否则转换会出错

"age" : 100

}

数组

JavaScript数组字面量表示法:

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

而JSON中的数组表示法同样没有变量赋值和分号:

[100, "Dkf", true]

一般比较常用的一种复杂形式是数组结合对象的形式:

[

{

"title" : "a",

"num" : 1

},

{

"title" : "b",

"num" : 2

},

{

"title" : "c",

"num" : 3

}

]

PS:一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串(XMLHttpRequest对象将在Aajx章节中详细探讨)。所以,我们可以模拟这种过程。

模拟加载JSON文本文件的数据,并且赋值给变量。

var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';

PS;上面这短代码模拟了var box = load('demo.json');赋值过程。因为通过load加载的文本文件,不管内容是什么,都必须是字符串。所以两边要加上双引号。

其实JSON就是比普通数组多了两边的双引号,普通数组如下:

var box = [{name : 'a', age : 1},{name : 'b', age : 2}];

二.解析和序列化

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

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

var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';

alert(box); //JSON字符串

var json = eval(box); //使用eval()函数解析

alert(json); //得到JavaScript原生值

ECMAScript5对解析JSON的行为进行规范,定义了全局对象JSON。支持这个对象的浏览器有IE8+、Firefox3.5+、Safari4+、Chrome和Opera10.5+。不支持的浏览器也可以通过一个开源库json.js来模拟执行。JSON对象提供了两个方法,一个是将原生JavaScript值转换为JSON字符串:stringify();另一个是将JSON字符串转换为JavaScript原生值:parse()。

var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; //特别注意,键要用双引号

alert(box);

var json = JSON.parse(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);

alert(json);

PS:如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为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);

PS:保留缩进除了是普通的数字,也可以是字符。

还有一种方法可以自定义过滤一些数据,使用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);

PS:由此可见序列化也有执行顺序,首先先执行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);

JavaScript(第三十一天)【JSON】的更多相关文章

  1. JavaScript基础笔记(十一)JSON

    JSON 关于JSON,最重要的一点是理解它是一种数据格式,不是编程语言. 一.语法 JSON 不支持变量.函数或对象实例,它就是一种表示结构化数据的格式,虽然与 JavaScript 中表示数据的某 ...

  2. JavaScript第三天 boolean和json

    布尔值 true:非零数字.非空字符串.非空对象 false:数字零.空字符串.null空对象.undefined  json JSON(JavaScript Object Notation) 是一种 ...

  3. Bootstrap <基础三十一>插件概览

    在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...

  4. JavaScript要点 (四)JSON

    JSON 是用于存储和传输数据的格式. JSON 通常用于服务端向网页传递数据 . 什么是 JSON? JSON 英文全称 JavaScript Object Notation JSON 是一种轻量级 ...

  5. javascript进击(八)JSON

    JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Ob ...

  6. JavaScript入门学习笔记(JSON)

    JSON是JavaScript Object Notation的简称,是一种轻量级的数据交换格式. JSON使用JS的语法,但其格式只是一个文本,可以被任何编程语言读取病作为数据格式传递. JSON以 ...

  7. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  8. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  9. 第二十一篇 json,picklz,xml模块

    Json模块 Json模块比较简单,仅有四个方法dumps()和loads()方法,dump()和load()方法,但是却非常的常用,实用性极强. 如果要在不同的编程语言之间传递对象,就必须把对象序列 ...

随机推荐

  1. winfrom如何在listview中添加控件

    private Button btn = new Button(); private void Form1_Load(object sender, EventArgs e) { ListViewIte ...

  2. 小程序版好友对战实战-wss部署与小程序用户登录时序

    上一篇文章是对需求的分析,本次将逐渐进入代码阶段.本次主要的内容包括服务端wss的部署以及小程序端用户授权的时序及逻辑. wss的配置与部署 微信小程序出于安全考虑,要求所有涉及到网络的操作,必须使用 ...

  3. JS对select动态添加options操作(主流浏览器兼容)

    之前项目中,遇到一个表单提交的页面,里面有多级下拉框联动的复杂逻辑,因此当时在做的过程中也是学到了不少容易出现问题的地方,下面就整理下当时遇到的一些关于下拉框的操作,并指出其中的一些注意点和坑: 有如 ...

  4. 【POJ 3401】Asteroids

    题面 Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x ...

  5. Luogu4137:Rmq Problem/mex

    题面 传送门 Sol 这题可能是假的 离线莫队搞一搞,把数字再分块搞一搞,就行了 # include <bits/stdc++.h> # define IL inline # define ...

  6. java把集合数据写入txt文档

    List<String> list= bs.findJson(); try { BufferedWriter bw = new BufferedWriter(new FileWriter( ...

  7. Java的深拷贝和浅拷贝

    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...

  8. ajax错误处理 500错误

    在使用ajax请求的时候 ,如果服务器返回的是500错误,或者其他非正常的http错误状态码时 会提示下面的错误  而我们需要把错误信息处理出来 $.ajax({ type:'get', url:&q ...

  9. kerberos下JAVA代码操作hbase的方式(客户端方式,应用程序方式)

    (一)如果部署JAVA 代码的主机用户获取了kerberos权限情况下 假设主机名是:client su - client 登录主机后 kinit -kt /keytab的路径/client.keyt ...

  10. 深度剖析PHP序列化和反序列化

    序列化 序列化格式 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构. 序列化函数原型如下: string serialize ( mixed $value ) 先看下面 ...