JSON,JavaScript Object Notation,JS对象表示法,是目前最常见的传输结构化数据的数据结构。

JSON并非编程语言,而是一种数据结构,像mp4、avi一样,只是一种数据格式而已。(数据结构可以包含很多数据类型)

JSON值的类型

  • 简单值
  • 对象
  • 数组

简单值:字符串、数字、布尔值和null,注意不包括undefined。

注意:JSON中的字符串必须用双引号。

对象:对象就是无序的键值对,而键值中的值也可以是简单值、对象或者数组。

注意:JSON中对象的属性必须用双引号括起来,JSON中没有变量的概念。

数组:有序的值的列表,而值本身可以是简单值、对象或者数组。

解析与序列化

JS中有个全局对象JSON,该对象有stringify()和parse()方法,分别用来序列化JS和解析JSON。

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1);
console.log(j2)

注意:因为JSON中没有undefined数据类型,所以该键值会被忽略。

{"name":"leo","age":19,"marry":false,"none":null}
{name: "leo", age: 19, marry: false, none: null}

序列化选项

JSON.stringify()函数还可以接收第二个和第三个参数,用来实现更为丰富的功能。

过滤

第二个参数可以是一个数组,数组包含对象属性的字符串形式:

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
};
var j1 = JSON.stringify(obj,["name","age",]);
console.log(j1); //{"name":"leo","age":19}

如果参数是函数:

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
};
var j1 = JSON.stringify(obj,function(key,value){
switch(key){
case "age":
return 20;
case "none":
return "没有";
case "marry":
return "false";
default:
return value;
}
});
console.log(j1); //{"name":"leo","age":20,"marry":"false","none":"没有"}

缩进

如果想缩进4空格:

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
};
var j1 = JSON.stringify(obj,null,4);
console.log(j1);
{
"name": "leo",
"age": 19,
"marry": false,
"none": null
}

注意:最大缩进为10格。

特殊字符:

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
};
var j1 = JSON.stringify(obj,null,"-->");
console.log(j1);
{
-->"name": "leo",
-->"age": 19,
-->"marry": false,
-->"none": null
}

使用toJSON:

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
toJSON: function(){
return this.name;
}
};
var j1 = JSON.stringify(obj);
console.log(j1); //"leo"

序列化该对象的顺序如下

(1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用 。

var obj = {
name: "leo",
age: 19,
marry: false,
other: undefined,
none: null,
releaseDate: new Date(2011, 11, 1),
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1,function(key,value){
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}
});
console.log(j2);
console.log(j2.releaseDate.getFullYear());
{"name":"leo","age":19,"marry":false,"none":null,"releaseDate":"2011-11-30T16:00:00.000Z"}
{name: "leo", age: 19, marry: false, none: null, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}age: 19marry: falsename: "leo"none: nullreleaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间) {}__proto__: Object
2011

还原函数在遇到"releaseDate"键时,会基于相应的值创建一个新的 Date 对象。结果就是
bookCopy.releaseDate 属性中会保存一个 Date 对象。正因为如此,才能基于这个对象调用
getFullYear()方法。

JS高程3:JSON的更多相关文章

  1. 对 js 高程 Preflighted Reqeusts 的理解

    看JS高程遇到 Preflighted Reqeusts不大理解,遂百度下: 转自:http://todoit.me/ajax-preflight/ 最近在做一个 VUE 的项目的时候, 和后端的小伙 ...

  2. Js循环读取JSON数据

    <script> $(function () { var jsonString = '{Unid:"1",CustomerName:"宋江",Age ...

  3. 吃透Javascript数组操作的正确姿势—再读《Js高程》

    Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...

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

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

  5. 《JS高程》创建对象的7种方式(完整版)

    一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...

  6. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

  7. 《JS高程》JS-Object对象整理

    继上篇<JS高程>对象&原型笔记,对JavaScript中的Object对象进行了整理,梳理一遍~ 参考文章:详解Javascript中的Object对象 ------------ ...

  8. js中的json对象详细介绍

    JSON一种简单的数据格式,比xml更轻巧,在JavaScript中处理JSON数据不需要任何特殊的API或工具包,下面为大家详细介绍下js中的json对象, 1.JSON(JavaScript Ob ...

  9. 【JS对象、JSON字符串】之间的相互转换

    在Firefox,chrome,opera,safari,ie9,ie8等浏览器直接可以用JSON对象的stringify()和parse()方法. 1.JSON.stringify(obj)将JS对 ...

随机推荐

  1. \r和\n的区别

    /n  是换行/r   是回车 这是两码事,换行是指移动到下一行,回车是指移动到行首,我们通常所说的“回车”其实是这两个动作的结合.

  2. [Java基础] Java对象内存结构

    转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的 ...

  3. [转]ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction

    本文转自:http://blog.csdn.net/alvachien/article/details/51576961 跟Entity Framework之前的版本不同,Class DbContex ...

  4. 在Windows Server 2008 R2上安装Exchange 2013过程中遇到的一些问题

    笔者对Exchange经验非常有限, 但也正因为如此, 这里分享的东西对从没接触过Exchange的朋友会有更多的帮助吧, 至少希望如此.   1. Exchange 2013的安装需要.net fr ...

  5. http://blog.sina.com.cn/s/blog_4a5dbd380101f031.html

    http://blog.sina.com.cn/s/blog_4a5dbd380101f031.html mvn clean install

  6. 关于Web界面查看日志的权限问题

    关于Web界面查看日志的权限问题 @(Hadoop) 访问集群的8088端口,通过web ui查看作业日志时,发现没有权限查看,8088主界面右上角显示Logged in as : dr.who,即匿 ...

  7. XAMPP + Xdebug+Zend Studio

    建立php开发环境(XAMPP + Xdebug+Zend Studio) 大家知道,运行php可以在apache上运行,但是要在apache上配置php解释器模块,懒得麻烦.就用XAMPP吧,它已经 ...

  8. 使用Loadrunner进行文件的上传和下载

    最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRu ...

  9. IOS Exception 1(libc++abi.dylib: terminating with uncaught exception of type NSException)

    2014-08-05 22:18:46.455 SwiftUI[1329:40871] -[_TtC7SwiftUI14MViewControler clickMe]: unrecognized se ...

  10. !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)

    题意:有一个n*n的格子.每一个格子里有不同数量的食物,老鼠从(0,0)開始走.每次下一步仅仅能走到比当前格子食物多的格子.有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物. 分析: ...