JSON:JavaScript对象表示法

1.1 JSON说明

曾经一段时间,XML是互联网传递数据的统一标准,但是业界一直不乏质疑XML的人士,他们都认为XML过于繁琐,冗长;提取数据也过于麻烦

2006年,JSON被提交给了IETF;在这之后,JSON逐渐发展起来,在互联网上得到广泛应用;

我们要记住:JSON只是一种数据格式,主要用来传递数据,并不是一种编程语言,虽然与JavaScript的语法相似,但是并不是JavaScript才使用JSON,毕竟JSON只是一种数据格式,很多编程语言都有针对JSON的解析器和序列化器

1.2 JSON语法

(1)基础语法:

  • 将JavaScript数据转化为JSON数据,也叫——序列化
// 把JavaScript对象序列化成JSON字符串
var jsonText = JSON.stringify(book);
  • 将JSON数据转化为JavaScript数据,也叫——解析
// 将JSON对象解析成原生JavaScript值
var js = JSON.parse(jsonText);

(2)JSON可以表示以下三种类型的数据:

简单值:可以在JSON里面表示 数值、字符串、布尔值、null不支持 undefined

对象:复杂数据类型,保存一组键值对;在JSON里,对象的键一定要加双引号,值可以是简单值,也可以是复杂数据类型的值

数组:复杂数据类型,保存一组值;值可以是简单值,也可以是复杂数据类型的值

JSON不支持变量,函数,对象实例等,它只是一种表示数据的格式,里面只用来存储数据,不会有逻辑、操作等代码在里面

  • 简单值,简单值中的字符串必须使用双引号,使用单引号报错

    number、string、bool、null
  • 对象,直接使用{ }符号,没有变量,括号后面不用加分号;同一个对象中不应该有相同的属性,以下两个location属性,分别属于不同对象,这样是没有问题的;

    {
    "name": "过青年",
    "age": 20,
    "arr": [1,2,3,4],
    "location": "江西宜春",
    "school": {
    "location": "江西南昌"
    }
    }
  • 数组,直接使用[ ]符号,里面简单值和复杂数据类型可以组合使用,构成更复杂的数据集合;

    [
    20,
    {
    "name": "过青年",
    "age": 20
    },
    [1,2,3],
    "过青年"
    ]

对象和数组一般是JSON数据最外层的结构,利用它们可以创造出各种各样的数据集合

1.3 序列化和解析

1.31 序列化选项

(1)过滤结果

JSON.stringify(js对象,过滤器参数)方法可以传递两个参数

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

    var obj = {
    name: "过青年",
    age: 20,
    arr: [1,2,3,4],
    location: "江西宜春",
    school: {
    location: "江西南昌"
    }
    } console.log(JSON.stringify(obj,["name","age","arr"]));
    // {"name":"过青年","age":20,"arr":[1,2,3,4]}
  • 如果过滤器参数是函数(过滤函数),可以改变序列化对象的结果;函数第一个参数默认是属性名(键),第二个参数默认是属性值

    如果返回的是undefined,则相应的属性名和属性值会被忽略

var jsonText = JSON.stringify(obj,function(key,value){
switch (key) {
case "name":
return 20;
case "age":
return "过青年";
case "arr":
return [4,3,2,1];
case "school":
return undefined;
default:
return value;
}
}); console.log(jsonText);
// {"name":20,"age":"过青年","arr":[4,3,2,1],"location":"江西宜春"}

(2)格式化:字符串缩进、空白符

第三个参数控制缩进和空白符

  • 如果是一个数值,表示空白字符个数,最大为10,大于10的转换成10;如果第三个参数是有效参数,会自动帮我们插入换行符,提高可读性;
var jsonText = JSON.stringify(obj,null,4);
console.log(jsonText);
/*
{
"name": "过青年",
"age": 20,
"arr": [
1,
2,
3,
4
],
"location": "江西宜春",
"school": {
"location": "江西南昌"
}
}
*/
  • 如果是一个字符串,这个字符串将被作为缩进字符,而非原来的空白字符作为缩进;字符串参数里的字符个数不能超过10个,超过10个,结果中只出现前十个字符;
var jsonText = JSON.stringify(obj,null,"-");
console.log(jsonText);
/*
{
-"name": "过青年",
-"age": 20,
-"arr": [
--1,
--2,
--3,
--4
-],
-"location": "江西宜春",
-"school": {
--"location": "江西南昌"
-}
}
*/

(3)toJSON方法

我们可以在需要序列化的对象上增加一个toJSON方法,这样当使用JSON.stringify()方法时,实际上就是调用了对象中的toJSON()方法

var obj = {
name: "过青年",
age: 20,
arr: [1,2,3,4],
location: "江西宜春",
school: {
location: "江西南昌"
},
toJSON:function(){
return this.name;
}
}
var jsonText = JSON.stringify(obj);
console.log(jsonText);
// 过青年

(4)把一个对象传入JSON.stringify()中,序列化该对象的顺序如下:

<1> 如果该对象中有toJSON方法,则直接调用该方法;

<2> 如果JSON.stringify()中有第二个参数,则应用过滤器,过滤器接受的值就是<1>中返回的值

<3> 过滤器处理<1>中返回的值

<4> 如果有第三个参数,执行相应的格式化

var obj = {
name: "过青年",
age: 20,
arr: [1,2,3,4],
location: "江西宜春",
school: {
"location": "江西南昌"
},
toJSON:function(){
name = this.name;
age = this.age;
return {name,age};
}
}
var jsonText = JSON.stringify(obj,function(key,value){
if(key === "name") {
return "哈哈哈";
}else{
return value;
}
});
console.log(jsonText); // {"name":"哈哈哈","age":20}

理解序列化对象的过程还是很重要的

1.31 解析选项

JSON.parse()方法也有两个参数,第二个参数是一个函数,叫做还原函数

var obj = {
name: "过青年",
age: 20,
arr: [1,2,3,4],
location: "江西宜春",
school: {
"location": "江西南昌"
}
};
var jsonText = JSON.stringify(obj);
var jsText = JSON.parse(jsonText,function(key,value){
if (key === "name") {
return "哈哈哈哈";
} else {
return value;
}
});
console.log(jsText);
//{name: '哈哈哈哈', age: 20, arr: Array(4), location: '江西宜春', school: {…}}

1.4 总结

  • JSON.stringify()用于序列化,JSON.parse()用于解析
  • JSON.stringify()有三个参数,第一个是js对象,第二个是过滤器,第三个是用来格式化JSON输出
  • JSON.parse()有两个参数,第一个参数是JSON对象,第二个参数是还原函数
  • js对象中可以声明一个toJSON方法,当JSON.stringify()方法调用时,自动执行toJSON方法
  • 注意,JSON.stringify()方法的返回值都是字符串类型

JSON基础使用详解的更多相关文章

  1. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  2. JWT基础概念详解

    JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...

  3. I2C 基础原理详解

    今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...

  4. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

  5. Nmap扫描教程之基础扫描详解

    Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在 ...

  6. jmeter 基础功能详解

    jmeter 基础功能详解 thread group:包含一组线程,每个线程独立地执行测试计划. sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,jdbc请求, ...

  7. hadoop基础-SequenceFile详解

    hadoop基础-SequenceFile详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SequenceFile简介 1>.什么是SequenceFile 序列文件 ...

  8. Cisco路由技术基础知识详解

    第一部分 请写出568A的线序(接触网络第一天就应该会的,只要你掐过,想都能想出来) .网卡MAC地址长度是(  )个二进制位(16进制与2进制的换算关系,只是换种方式问,不用你拿笔去算) A.12  ...

  9. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

随机推荐

  1. Vue结合路由配置递归实现菜单栏

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...

  2. 034.Kubernetes集群安全-Secret

    一 secret概述 1.1 secret作用 Secret对象,主要作用是保管私密数据,比如密码.OAuth Tokens.SSH Keys等信息.将这些私密信息放在Secret对象中比直接放在Po ...

  3. 【JMeter_06】JMeter逻辑控制器__If控制器<If Controller>

    If控制器<If Controller> 业务逻辑: 根据表达式的结果来决定是否执行控制器下的脚本内容,与编程语言中的if判断逻辑大致相同,表达式结果为布尔值 true或false; 当表 ...

  4. Ngnix 配置文件快速入门

    转自https://www.cnblogs.com/knowledgesea/p/5175711.html 其实也没什么好说的,我想大部分人也不会在意nginx的实现原理啥的.服务器要部署的时候,把n ...

  5. Jenkins中agent的使用

    [前言] 很多小伙伴都已经会搭建Jenkins环境了,都想要用Jenkins来运行自动化接口,可我们的Jenkins在linux服务器上.服务器上默认的python包是2.6的这样不是很好,那么这边就 ...

  6. Jenkins项目构建运行

    [准备环境] 继Jenkins环境搭建完成后,进行插件的管理 [思路] 项目顺序是,开发提交代码到代码仓库,测试通过Jenkins拉下开发的代码打包部署: 1.开发提交代码 2.Jenkins自动从代 ...

  7. Linux下如何寻找相同文件?

    大家好,我是良许. 随着电脑的使用,系统里将产生很多垃圾,最典型的就是同一份文件被保存到了不同的位置,这样导致的结果就是磁盘空间被大量占用,系统运行越来越慢. 所以如果你的电脑空间告急的话,可以试着去 ...

  8. elasticserach数据库深度分页查询的原理

    深度分页存在的问题 https://segmentfault.com/a/1190000019004316?utm_source=tag-newest 在实际应用中,分页是必不可少的,例如,前端页面展 ...

  9. linuxshell编程之环境变量配置文件 Tony Linux系统工程师

    视频参考慕课网 如果修改了环境变量的配置文件,要使得修改的环境变量生效可以使用下面的两个命令 下面是点后面加上了一个空格然后再加上配置文件,这里一定要注意下 这里要注意和隐藏文件的区别: 在linux ...

  10. 微信小程序上传Word文档、PDF、图片等文件

    <view class="main" style="border:none"> <view class="title"&g ...