JS高程3:JSON
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的更多相关文章
- 对 js 高程 Preflighted Reqeusts 的理解
看JS高程遇到 Preflighted Reqeusts不大理解,遂百度下: 转自:http://todoit.me/ajax-preflight/ 最近在做一个 VUE 的项目的时候, 和后端的小伙 ...
- Js循环读取JSON数据
<script> $(function () { var jsonString = '{Unid:"1",CustomerName:"宋江",Age ...
- 吃透Javascript数组操作的正确姿势—再读《Js高程》
Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...
- MVC中处理Json和JS中处理Json对象
MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...
- 《JS高程》创建对象的7种方式(完整版)
一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- 《JS高程》JS-Object对象整理
继上篇<JS高程>对象&原型笔记,对JavaScript中的Object对象进行了整理,梳理一遍~ 参考文章:详解Javascript中的Object对象 ------------ ...
- js中的json对象详细介绍
JSON一种简单的数据格式,比xml更轻巧,在JavaScript中处理JSON数据不需要任何特殊的API或工具包,下面为大家详细介绍下js中的json对象, 1.JSON(JavaScript Ob ...
- 【JS对象、JSON字符串】之间的相互转换
在Firefox,chrome,opera,safari,ie9,ie8等浏览器直接可以用JSON对象的stringify()和parse()方法. 1.JSON.stringify(obj)将JS对 ...
随机推荐
- boost.asio包装类st_asio_wrapper开发教程(转)
一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...
- OpenCV腐蚀与膨胀(Eroding and Dilating)
腐蚀与膨胀(Eroding and Dilating) 目标 本文档尝试解答如下问题: 如何使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀( Erosion 与 Dilation): ero ...
- iOS:导航控制器侧滑出栈实现
介绍:在iOS中,导航控制器UINavigationController是默认实现左侧边缘侧滑手势出栈的,但是如果当开发者对导航控制器子控制实现自定义leftBaButtonItem时,这个侧滑功能就 ...
- thinkphp5.0 中使用第三方无命名空间的类库
ThinkPHP5建议所有的扩展类库都使用命名空间定义,如果你的类库没有使用命名空间,则不支持自动加载,必须使用Loader::import方法先导入文件后才能使用. 首先要在文件头部使用loader ...
- python读取中文
如何从文件中读取300个汉字? 看起来很简单,但很容易掉坑里了. 一开始我这么写: try: fd = codecs.open(os.path.join(settings.TEXT_CONTENT_D ...
- PHP定时执行计划任务
一.Windows计划任务 在web 服务下新建需要执行的文件 二.新建bat文件,命名为test.bat,内容如下: D:\php\php.exe -q D:\website\test.php 三. ...
- SSL Pining Mode 设置iOS SSL 连接安全
一:SSL Ping Mode 使用SSL来进行网络通信成为了很多mobile app的默认选择.最近一些文章发现:一些app并没有采用“额外的措施”来保证窃听不可以发生:这个“额外的步骤“就是SSL ...
- Unity3d 显示IOS基本的游戏中心脚本
using UnityEngine; using UnityEngine.SocialPlatforms; public class Startup : MonoBehaviour { // we'l ...
- Android:singleTask + onActivityResult
解决2个Activity互相跳转,并且栈中只保留每个Activity一个对象的存在. 在2个Activity中分别都要用到onActivityResult,所以就不能用launchMode=" ...
- SCRUM敏捷开发规则一栏
敏捷.敏捷开发这类词近期非常火!敏捷开发,就是指可以在需求迅速变化的情况下高速开发软件.我们接触最多的和敏捷相关的名词是:极限编程(XP).结对编程.測试驱动开发(TDD)等. 敏捷建模(Agile ...