前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

  JSON (javascript object notation) 全称是 javascript 对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据。2001年由Douglas Crockford提出,目的是取代繁琐笨重的 XML 格式。正确的 JSON 格式需要符合一定的语法规则,使用 www.json.cn 网站可以对 JSON 进行格式校验;

语法规则

  JSON 的语法可以表示以下三种类型的值:简单值、对象、数组。

简单值

  简单值使用与 javascript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null;JSON 不支持 javascript 中的特殊值 undefined;

  字符串必须使用双引号表示,不能使用单引号。数值必须以十进制表示,且不能使用 NaN 和 Infinity;

对象

  对象作为一种复杂数据类型,表示的是一组有序的键值对。而每个键值对中的值可以是简单值,也可以是复杂数据类型的值;

  与 javascript 的对象字面量相比,JSON 有三个不同的地方:

  1. JSON 没有变量的概念
  2. JSON 中,对象的键名必须放在双引号里面
  3. 因为 JSON 不是 javascript 语句,所以没有末尾的分号

  同一个对象中不应该出现两个同名属性;

数组

  数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组

  JSON 数组也没有变量和分号,把数组和对象结合起来,可以构成更复杂的数据集合

  数组或对象最后一个成员的后面,不能加逗号;

JSON对象

  JSON 之所以流行,是因为可以把 JSON 数据结构解析为有用的 javascript 对象;

  ECMAScript5 对解析 JSON 的行为进行了规范,定义了全局对象 JSON;IE7及以下浏览器不支持;

  JSON 对象有两个方法:stringify() 和 parse()。这两个方法分别用于把 JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值;

JSON.stringify()

  JSON.stringify() 方法用于将一个JavaScript 值转为 JSON 字符串。该字符串应该符合 JSON 格式,并且可以被 JSON.parse() 方法还原; 

  默认情况下,JSON.stringify() 输出的 JSON 字符串不包括任何空格字符或缩进 ;

  JSON.stringify() 方法会忽略对象的不可遍历属性;

        <script type="text/javascript">
var mate = {
"title":"javascript",
"person":{
"name":"jack",
"age":"18"
}
}; console.log(JSON.stringify(mate));//{"title":"javascript","person":{"name":"jack","age":"18"}}
console.log(JSON.stringify(new Date()));//"2017-09-25T10:50:42.362Z"
</script>

  

  JSON.stringify() 除了要序列化的 javascript 对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 javascript 对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在 JSON 字符串中保留缩进;

  当 JSON.stringify() 方法的第二个参数是一个数组时,这时相当于实现一个过滤器的功能;过滤器只对对象的第一层属性有效;

  过滤器对数组无效;

        <script type="text/javascript">
var mate = {
"title":"javascript",
"person":{
"name":"jack",
"age":"18"
}
}; console.log(JSON.stringify(mate,['bbb','person','aaaaaa','age']));//{"person":{"age":"18"}}
//当 JSON.stringify() 方法的第二个参数是一个数组时,这时相当于实现一个过滤器的功能;过滤器只对对象的第一层属性有效; var arr = ["a","b"];
console.log(JSON.stringify(arr,["c"]));//["a","b"]
//过滤器对数组无效
</script>

  JSON.stringify() 方法的第二个参数也可以是一个函数。传入的函数接收两个参数,属性(键)名和属性值;

  属性(键)名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串;

  这个函数参数会递归处理所有的键;

        <script type="text/javascript">
var data = {
"title":"javascript",
"person":{
"name":"jack",
"age":"18",
a:{
bbb:1111
}
}
}; //属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串
//这个函数参数会递归处理所有的键
JSON.stringify(data,function(key,value){
console.log("["+ key + "]:" + value);
return value;
})
// []:[object Object] 第一次键名为空,键值是整个对象
// [title]:javascript
// [person]:[object Object]
// [name]:jack
// [age]:18
// [a]:[object Object]
// [bbb]:1111
</script>

  函数返回的值就是相应键的值。如果函数返回了undefined或没有返回值,那么相应的属性会被忽略;

        <script type="text/javascript">
var data = {
"title":"javascript",
"person":{
"name":"jack",
"age":"18",
a:{
bbb:1111
}
}
}; //函数返回的值就是相应键的值。如果函数返回了undefined或没有返回值,那么相应的属性会被忽略
JSON.stringify(data,function(key,value){
if(typeof(value) === "string"){
return undefined;
}
console.log("["+ key + "]:" + value);
return value;
})
// []:[object Object]
// [person]:[object Object]
// [a]:[object Object]
// [bbb]:1111
</script>

  

  JSON.stringify() 方法还可以接受第三个参数,表示数据之间的缩进(默认为0),用于增加返回的 JSON 字符串的可读性;

  如果是数字,表示每个属性前面添加的空格(最多不超过10个),一个 tab 是4个空格,所以一般写2或者4;

  如果是字符串(不超过10个字符),则该字符串会添加在每行前面;

        <script type="text/javascript">
var data = {
"title":"javascript",
"person":{
"name":"jack",
"age":"18",
a:{
bbb:1111
}
}
}; console.log(JSON.stringify(data,null,'数据'));
//{
//数据"title": "javascript",
//数据"person": {
//数据数据"name": "jack",
//数据数据"age": "18",
//数据数据"a": {
//数据数据数据"bbb": 1111
//数据数据}
//数据}
//}
</script>

JSON.parse()

  JSON.parse() 方法用于将 JSON 字符串转化成 javascript 对象;前端获取 JSON 数据后,要先用它转化后才能操作数据;

  如果传入的字符串不是有效的 JSON 格式,JSON.parse方法将报错;

  JSON.parse() 方法也可以接收一个函数参数,在每个键值对上调用,这个函数被称为还原函数(reviver)。该函数接收两个参数,一个键和一个值,返回一个值;

  如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中;

        <script type="text/javascript">
var test = JSON.parse('{"title":"javascript","person":{"name":"Shane","age":"18"}}',function(key,value){
if (key === ''){
return value
}else if(key === 'person'){
return value;
}
return value;
}); console.log(test.person.name);//Shane
</script>

  在将日期字符串转换为Date对象时,经常要用到还原函数;

        <script type="text/javascript">
var person = {
"name": "Shane",
"date": new Date(2017,10,10)
}
var jsonData = JSON.stringify(person); var bookCopy = JSON.parse(jsonData,function(key,value){
if(key == 'date'){
return new Date(value);
}
return value;
})
console.log(bookCopy.date.getMonth());//10
</script>

jacascript JSON对象的学习的更多相关文章

  1. python3 JSON对象的学习

    import jsonname = { 'alex':[22,'M'], 'tony':[21,'F'],} name_after = json.dumps(name)name_after = nam ...

  2. Spring MVC学习笔记——返回JSON对象

    1.想要GET请求返回JSON对象,首先需要导入jackson-all-1.9.4.jar包 2.在控制器中添加不同的show()方法 //show()方法返回JSON对象 @RequestMappi ...

  3. js学习-自定义函数、对象的字面量、json对象学习小结

    一.自定义对象的构造: var student=new Object(); //object是顶级对象,使用构造函数的方法创建一个对象,此处的意思是创建了一个学生的空对象 student.name=& ...

  4. javascript学习-创建json对象数据,遍历

    之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...

  5. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  6. 学习javaScript必知必会(6)~类、类的定义、prototype 原型、json对象

    一.定义类:使用的是funciton,因为在js中没有定义类的class语句,只有function. ■ 举例: //定义一个Person类(通过类的无参构造函数定义类) function Perso ...

  7. 前端页面使用 Json对象与Json字符串之间的互相转换

    前言 在前端页面很多时候都会用到Json这种格式的数据,最近没有前端,后端的我也要什么都要搞,对于Json对象与Json字符串之间的转换终于摸清楚了几种方式,归纳如下! 一:Json对象转换为json ...

  8. JSON对象长度和遍历方法

    摘自博客 (http://caibaojian.com/json-length.html) 原文链接:http://caibaojian.com/json-length.html JSON数组有长度j ...

  9. (转)JSON对象长度和遍历方法

    最近在修改一个HTML页面的JS的时候遍历JSON对象,却怎么也调试不通过.怪这个HTML网页不知道用了什么方法禁止了js错误提示,刚开始的时候不知道有这个问题,用chrome的开发人员工具都没发现错 ...

随机推荐

  1. [ZJOI2007] 矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  2. Eclipse中的所有快捷键列表

    Eclipse中的所有快捷键列表: Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制 ...

  3. SQL注入之Sqli-labs系列第一篇

    在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...

  4. mysqldump 备份脚本

    #!/bin/bash DUMP=/usr/bin/mysqldump OUT_DIR=/home/mysql LINUX_USER=root DB_NAME=snale DB_USER=root D ...

  5. KVM之一:安装准备(基于CentOS6.7)

    KVM 虚拟机简介: Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自 ...

  6. 跟着大神学zookeeper分布式锁实现-----来自Ruthless

    前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...

  7. vue 源码学习----build/config.js

    1. process 这个process是什么?为何都没有引入就可以使用了呢? process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对 ...

  8. 关于redis数据库的简单思考

    redis数据库中有以下几种数据类型: 字符串,哈希,列表,集合,有序集合 它们应用的场景如下: 字符串用法单一,用于存储一个key的值,用于一一对应的场合 列表作为数组来使用 对于哈希,特别适用于存 ...

  9. windows环境下,apache虚拟主机配置

    在windows环境下,apache从配置文件的相关配置: Windows 是市场占有率最高的 PC 操作系统, 也是很多人的开发环境. 其 VirtualHost 配置方法与 Linux 上有些差异 ...

  10. 201621123035 《Java程序设计》第1周学习总结

    1.本周学习总结 本周学习内容:Java平台概论.认识JDK规范与操作.了解JVM.JRE与JDK.撰写Java原始码.path是什么 关键词:JVM.JRE.JDK 联系:JVM是Java虚拟机的缩 ...