上篇咱们讲解了JSON的诞生缘由是由于XML整合到HTML中各个浏览器实现的细节不尽相同,因此道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(Chip Morningstar)一块儿从JS的数据类型中提取了一个子集,做为新的数据交换格式,由于主流的浏览器使用了通用的JavaScript引擎组件,因此在解析这种新数据格式时就不存在兼容性问题,因而他们将这种数据格式命名为 “JavaScript Object Notation”,缩写为 JSON,由此JSON便诞生了!javascript
今天咱们来学习一下JSON的结构形式、数据类型、使用场景以及注意事项吧!html
上面咱们知道JSON是从JavaScript的数据类型中提取出来的子集,那JSON有几种结构形式呢?又有哪些数据类型呢?他们又分别对应着JavaScript中的哪些数据类型呢?前端
一、键值对形式java
上期咱们举了一个JSON的实例,就是键值对形式的,以下:node
{ "person": { "name": "pig", "age": "18", "sex": "man", "hometown": { "province": "江西省", "city": "抚州市", "county": "崇仁县" } } }
这种结构的JSON数据规则是:一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每一个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔,。
二、数组形式
由于大多数时候你们用的JSON可能都是上面那种key-value形式,因此不少人在讲解JSON的时候老是会忽略数组形式,这一点是须要注意的。python
那JSON的数组形式是怎么样的呢?猪哥也举一个实例吧!web
["pig", 18, "man", "江西省抚州市崇仁县"]
数组形式的JSON数据就是值(value)的有序集合。一个数组以 [左中括号 开始, ]右中括号 结束。值之间使用 ,逗号 分隔。数据库
上面两种JSON形式内部都是包含value的,那JSON的value到底有哪些类型,并且上期咱们说JSON其实就是从Js数据格式中提取了一个子集,那具体有哪几种数据类型呢?express
以上数据形式图片来源JSON官方文档:http://www.json.org/json-zh.htmlnpm
介绍完JSON的数据格式,那咱们来看看JSON在企业中使用的比较多的场景。
JSON用的最多的地方莫过于Web了,如今的数据接口基本上都是返回的JSON,具体细化的场景有:
这种API接口通常都会提供一个接口文档,说明接口的入参、出参等,
通常的接口返回数据都会封装成JSON格式,好比相似下面这种
{ "code": 1, "msg": "success", "data": { "name": "pig", "age": "18", "sex": "man", "hometown": { "province": "江西省", "city": "抚州市", "county": "崇仁县" } } }
程序在运行时全部的变量都是保存在内存当中的,若是出现程序重启或者机器宕机的状况,那这些数据就丢失了。通常状况运行时变量并非那么重要丢了就丢了,但有些内存中的数据是须要保存起来供下次程序或者其余程序使用。
保存内存中的数据要么保存在数据库,要么保存直接到文件中,而将内存中的数据变成可保存或可传输的数据的过程叫作序列化,在Python中叫pickling,在其余语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
正常的序列化是将编程语言中的对象直接转成可保存或可传输的,这样会保存对象的类型信息,而JSON序列化则不会保留对象类型!
为了让你们更直观的感觉区别,猪哥用代码作一个测试,你们一目了然
对于JSON序列化不能保存class信息的特色,那JSON序列化还有什么用?答案是固然游有用,对于不一样编程语言序列化读取有用,好比:我用Python爬取数据而后转成对象,如今我须要将它序列化磁盘,而后使用Java语言读取这份数据,这个时候因为跨语言数据类型不一样,因此就须要用到JSON序列化。
存在即合理,两种序列化可根据需求自行选择!
首先声明Token的形式多种多样,有JSON、字符串、数字等等,只要能知足需求便可,没有规定用哪一种形式。
JSON格式的Token最有表明性的莫过于JWT(JSON Web Tokens)。
随着技术的发展,分布式web应用的普及,经过Session管理用户登陆状态成本愈来愈高,所以慢慢发展成为Token的方式作登陆身份校验,而后经过Token去取Redis中的缓存的用户信息,随着以后JWT的出现,校验方式更加简单便捷化,无需经过Redis缓存,而是直接根据Token取出保存的用户信息,以及对Token可用性校验,单点登陆更为简单。
猪哥也曾经使用JWT作过app的登陆系统,大概的流程就是:
JWT登陆认证有哪些优点:
更多JWT相关知识自行在网上学习,本文不过多介绍!
说实话JSON做为配置文件使用场景并很少,最具表明性的就是npm的package.json包管理配置文件了,下面就是一个npm的package.json配置文件内容。
{ "name": "server", //项目名称 "version": "0.0.0", "private": true, "main": "server.js", //项目入口地址,即执行npm后会执行的项目 "scripts": { "start": "node ./bin/www" ///scripts指定了运行脚本命令的npm命令行缩写 }, "dependencies": { "cookie-parser": "~1.4.3", //指定项目开发所需的模块 "debug": "~2.6.9", "express": "~4.16.0", "http-errors": "~1.6.2", "jade": "~1.11.0", "morgan": "~1.9.0" } }
但其实JSON并不合适作配置文件,由于它不能写注释、做为配置文件的可读性差等缘由。
配置文件的格式有不少种如:toml、yaml、xml、ini等,目前不少地方开始使用yaml做为配置文件。
最后咱们来看看Python中操做JSON的方法有哪些,在Python中操做JSON时须要引入json
标准库。
import json
一、Python类型转JSON:json.dump()
# 一、Python的dict类型转JSON person_dict = {'name': 'pig', 'age': 18, 'sex': 'man', 'hometown': '江西抚州'} # indent参数为缩进空格数 person_dict_json = json.dumps(person_dict, indent=4) print(person_dict_json, '\n') # 二、Python的列表类型转JSON person_list = ['pig', 18, 'man', '江西抚州'] person_list_json = json.dumps(person_list) print(person_list_json, '\n') # 三、Python的对象类型转JSON person_obj = Person('pig', 18, 'man', '江西抚州') # 中间的匿名函数是得到对象全部属性的字典形式 person_obj_json = json.dumps(person_obj, default=lambda obj: obj.__dict__, indent=4) print(person_obj_json, '\n')
执行结果:
二、JSON转Python类型:json.loads()
# 四、JSON转Python的dict类型 person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西抚州"}' person_json_dict = json.loads(person_json) print(type(person_json_dict), '\n') # 五、JSON转Python的列表类型 person_json2 = '["pig", 18, "man", "江西抚州"]' person_json_list = json.loads(person_json2) print(type(person_json_list), '\n') # 六、JSON转Python的自定义对象类型 person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西抚州"}' # object_hook参数是将dict对象转成自定义对象 person_json_obj = json.loads(person_json, object_hook=lambda d: Person(d['name'], d['age'], d['sex'], d['hometown'])) print(type(person_json_obj), '\n')
执行结果以下:
上面咱们演示了Python类型与JSON的相互转换,最开始的时候咱们讲过JSON有6种数据类型,那这6种数据类型分别对应Python中的哪些数据类型呢?
load/dump
仍是用loads\dumps
?他们之间有什么区别?何时该加s
何时不应加s
?这个咱们能够经过查看源码找到答案:不加s
的方法入参多了一个fp
表示filepath,最后多了一个写入文件的操做。因此咱们在记忆的时候能够这样记忆:加s
表示转成字符串(str),不加s
表示转成文件。今天咱们学习了JSON的2种形式,切记JSON还有[...]
这种形式的。
学习了JSON的6种数据类型他们分别对于Python中的哪些类型。
了解了JSON的一些使用场景以及实际的例子。
还学习了在Python中如何使用JSON以及须要注意的事项。
结合上期的JSON的诞生与发展介绍,咱们JSON相关的知识基本就介绍的差很少,后面会出一些爬虫实际案例来教你们如何解析返回JSON数据。
一个JSON知识点却分两篇长文(近万字)来说,其重要性不言而喻。由于无论你是作爬虫、仍是作数据分析、web、甚至前端、测试、运维,JSON都是你必需要掌握的一个知识点!