JSON是一个轻量级的数据格式,可以简化表示数据结构的工作量。在实际工作中,我们经常用它来传递数据,不过对于其使用的一些细节还是需要注意的。在ECMAScript5中定义了原生的JSON对象,可以用来将对象序列化为JSON字符串,或者将JSON数据解析为javascript对象。

一、JSON语法

JSON可以用来表示三种类型的值:简单值、对象和数组。对象和数组一般是JSON结构的最外层形式。

1.JSON简单值

可以在JSON中表示字符串、数值、布尔值、null。

例如:

5//数值类型

"hello json"//字符串类型

注意:

①JSON不支持js中的特殊值undefined;

②JSON字符串必须使用双引号,不能使用单引号。

③在实际应用中,JSON一般用来表示较复杂的数据结构,而简单值一般用作复杂数据结构中的一部分。

2.对象

JSON对象与JavaScript对象字面量对象的语法是类似的。

//JavaScript对象字面量表示
var jsWeatherinfo={
city:"北京",
cityid:"101010100",
weather:"多云转晴"
//JSON对象
{
"city":"北京",
"cityid":"101010100",
"weather":"多云转晴"
}

但是有几点不同:

①JSON中没有变量的概念,所以没有声明变量;

②JSON末尾没有分号;

③JSON对象中的属性名一定要使用双引号,而JavaScript对象中的属性引号是可有可无的。

3.数组

JSON数组采用的是javascript的数组字面量形式.

//JavaScript数组

var result=[1,true,"today"];

//JSON数组

[1,true,"today"]

区别:JSON数组没有末尾的分号,也没有声明变量.

二、JSON序列化

1.JSON对象

JavaScript的eval()函数可以用来解析JSON并返回JavaScript对象,不过eval()对JSON结构求值是存在风险的.因此,在ECMAScript5中新增了全局的JSON对象.JSON对象有两个方法:stringify()和parse().

stringify()用于把JavaScript对象序列化为JSON字符串;

parse()用于把JSON字符串解析为原生的JavaScript值.

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多云转晴',
'img1': 'd1.gif',
'img2': 'n0.gif',
'ptime': '11:00'
};
var text=JSON.stringify(weather);
var json=JSON.parse(text);
json.weather;//"多云转晴"

2.JSON.stringify()

JSON.stringify()方法有三个参数:

第一个参数是要序列化的JavaScript对象;

第二个参数是过滤器,可以是一个数组或者函数;

第三个参数是一个布尔值,表示是否在JSON字符串中保留缩进.

①过滤器

如果过滤器参数是数组,那么stringify()结果中只包含该数组中列出的属性.

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多云转晴',
'img1': 'd1.gif',
'img2': 'n0.gif',
'ptime': '11:00'
};
var text=JSON.stringify(weather,["city","weather","temp1","temp2"]);
//结果:"{"city":"北京","weather":"多云转晴","temp1":"31℃","temp2":"20℃"}"

如果过滤器是函数,传入的函数有两个参数:属性名和属性值.根据属性名来判断如何处理序列化对象中相应的属性.如果函数返回了undefined,那么相应的属性就会被忽略.

var text1 = JSON.stringify(weather, function (key, value) {
switch (key) {
case 'temp1':
return '最高温度' + value;
case 'temp2':
return '最低温度' + value;
case 'img1':
case 'img2':
case 'ptime':
return undefined;//属性被忽略
default:
return value;
}
});
//结果:"{"city":"北京","cityid":"101010100","temp1":"最高温度31℃","temp2":"最低温度20℃","weather":"多云转晴"}"

③字符串缩进

JSON.stringify()第三个参数用来控制结果中的缩进情况.

如果缩进参数传入的是数值,表示每个json字段缩进的空格数,但是最大缩进空格数不超过10.

var text2=JSON.stringify(weather,null,5)

如果缩进参数传入的是字符串,则表示JSON字符串中每个级别都使用该字符串作为缩进字符.不过该字符串也不能超过10个字符长.

var text3=JSON.stringify(weather,null,"--")

④toJSON()方法

如果JSON.stringify()不能满足某些对象的序列化需求,可以给对象自定义toJSON方法,返回其自身的JSON数据格式。

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多云转晴',
toJSON:function(){
return this.city+this.weather+",最高温度"+this.temp1+",最低温度"+this.temp2;
}
};
JSON.stringify(weather);//""北京多云转晴,最高温度31℃,最低温度20℃""

综合以上几种情况,JSON.stringify()序列化对象的顺序如下:

①如果对象存在toJSON方法且能返回有效值,则调用该方法;否则,仍然按照默认顺序执行序列化。

②如果stringify()存在第二个参数,应用这个过滤器;

③对第②步返回的每个值进行序列化;

④如果存在第三个参数,执行相应的格式化。

三、JSON解析

JSON.parse()用来将JSON字符串解析成JavaScript对象。

该方法第一个参数要解析的JSON字符串;

第二个参数是一个函数还原函数。还原函数有两个参数key和value。如果还原函数返回undefined,则表示将该属性从结果中删除;如果返回其它值,则将该值插入到结果当中。在将日期字符串转换为Date对象时,经常用到还原函数.

var json = {
'city': '北京',
'cityid': '101010100',
'temp1': '19℃',
'temp2': '32℃',
'weather': '晴',
'ptime': new Date()
};
var text = JSON.stringify(json);
JSON.parse(text, function (key, value) {
switch (key) {
case 'ptime':
return new Date(value);//返回日期对象
case 'cityid':
return undefined;//删除该属性
default:
return value;
}
});

读javascript高级程序设计13-JSON的更多相关文章

  1. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  2. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  3. 读javascript高级程序设计08-引用类型之Global、Math、String

    一.Global 所有在全局作用域定义的属性和方法,都属于Global对象. 1.URI编码: encodeURI():主要用于对整个URI编码.它不会对本身属于URI的特殊字符进行编码. encod ...

  4. 《JAVASCRIPT高级程序设计》JSON语法/解析/序列化

    JSON是一种数据格式,不是一种编程语言. 一.语法 JSON语法可以表示以下三种类型的值:简单值.对象.数组. 1.简单值 最简单的JSON数据值就是简单值: 5 "hello world ...

  5. 读javascript高级程序设计10-DOM

    一.节点关系 元素的childNodes属性来表示其所有子节点,它是一个NodeList对象,会随着DOM结构的变化动态变化. hasChildNodes():是否有子节点. var headline ...

  6. 读javascript高级程序设计15-Ajax,CORS,JSONP,Img Ping

    平时用惯了jQuery.ajax之类的方法,却时常忽略了它背后的实现,本文是学习了AJAX基础及几种跨域解决方案之后的一些收获. 一.AJAX——XMLHttpRequest 谈起Ajax我们都很熟悉 ...

  7. JavaScript高级程序设计之JSON

    IE8以下请求助神之Douglas Crockford:https://github.com/douglascrockford/json-js JSON是一种格式化的字符串,特别适合在网络上传输,由D ...

  8. 读javascript高级程序设计17-在线检测,cookie,子cookie

    一.在线状态检测 开发离线应用时,往往在离线状态时把数据存在本地,而在联机状态时再把数据发送到服务器.html5提供了检测在线状态的方法:navigator.onLine和online/offline ...

  9. 读Javascript高级程序设计第三版第六章面向对象设计--创建对象

    虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,a ...

随机推荐

  1. 简明python教程 --C++程序员的视角(二):函数及作用域

    函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. 函数的基本概念 1 位置:从左往右进行 ...

  2. fasta文件拆分与合并

    Linux中fasta文件的拆分与合并 FASTA文件的拆分: (1)如果从一个文件a提取第11至20个序列存到另一个文件b: awk -v RS='>' 'NR>1{i++}i>= ...

  3. jquery之ajax

    语法: $.ajax(url,[settings])/jQuery.ajax(url,[settings]) 返回值:XMLHttpRequest (该函数属于全局jQuery对象(也可理解为静态函数 ...

  4. JS控制checkbox全选、取消全选、删除功能的代码贴出来。。

    function checkAll() { var code_Values = document.getElementsByTagName("input"); for(i = 0; ...

  5. es5.0 head插件安装

    1. 在 elasticsearch.yml 文件增加配置http.cors.enabled: truehttp.cors.allow-origin: "*"2. 下载插件git ...

  6. IOS Xcode7 新建PCH文件

    第一步:新建文件找到iOS中的Othere点击PCH File 点击Next 第二步:修改文件名为当前工程名(一般与工程名同名),勾选Targets,点击create创建 第三步:如图选中红框中的路径 ...

  7. Sharepoint2013切换用户菜单

          Sharepoint2013中没有切换用户的菜单,每次登录后,浏览器就会记住密码.要重新换一个用户登录的时候,就需要把浏览器都关闭,然后重新启动.这样非常不方便.特别是在测试权限这一块的时 ...

  8. 【20160924】GOCVHelper 图像处理部分(2)

    //根据轮廓的面积大小进行选择     vector<VP>  selectShapeArea(Mat src,Mat& draw,vector<VP> contour ...

  9. 8-JS闭包、回调实例

    1.回调 javascipt中,函数回调一般用于以下几种场景: 1.异步执行(例如读取文件,进行HTTP请求) 2.同步(阻塞) 3.事件监听和处理 4.设置超时和时间间隔的方法 异步例子(使用AJA ...

  10. [问题2014A08] 解答

    [问题2014A08] 解答 由假设知 \(f(A)=\mathrm{tr}(AA')\), 因此 \[f(PAP^{-1})=\mathrm{tr}(PAP^{-1}(P')^{-1}A'P')=\ ...