责编 | maozz
JSON的出身缘故原由是由于XML整合到HTML中各个浏览器实现的细节不尽相同,以是道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(Chip Morningstar)一起从JS的数据类型中提取了一个子集,作为新的数据交流格式,由于主流的浏览器利用了通用的JavaScript引擎组件,以是在解析这种新数据格式时就不存在兼容性问题,于是他们将这种数据格式命名为 “JavaScript Object Notation”,缩写为 JSON,由此JSON便出身了!
本日我们来学习一下JSON的构造形式、数据类型、利用场景以及把稳事变吧!

JSON格式
上面我们知道JSON是从JavaScript的数据类型中提取出来的子集,那JSON有几种构造形式呢?又有哪些数据类型呢?他们又分别对应着JavaScript中的哪些数据类型呢?
JSON的2种构造形式,键值对形式和数组形式。
举了一个JSON的实例,便是键值对形式的,如下:
{
\公众person\公众: {
\"大众name\"大众: \公众pig\公众,
\"大众age\"大众: \公众18\"大众,
\"大众sex\"大众: \公众man\"大众,
\"大众hometown\"大众: {
\"大众province\"大众: \公众江西省\公众,
\"大众city\"大众: \"大众抚州市\公众,
\"大众county\"大众: \公众崇仁县\"大众
}
}
}
这种构造的JSON数据规则是:一个无序的“‘名称/值’对”凑集。一个工具以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间利用 ,逗号 分隔。
由于大多数的时候大家用的JSON可能都是上面那种key-value形式,以是很多人在讲解JSON的时候总是会忽略数组形式,这一点是须要把稳的。
那JSON的数组形式是怎么样的呢?举一个实例吧!
[\"大众pig\公众, 18, \"大众man\公众, \"大众江西省抚州市崇仁县\"大众]
数组形式的JSON数据便是值(value)的有序凑集。一个数组以 [左中括号 开始, ]右中括号 结束。值之间利用 ,逗号 分隔。
JOSN的6种数据类型
上面两种JSON形式内部都是包含value的,那JSON的value到底有哪些类型,而且上期我们说JSON实在便是从Js数据格式中提取了一个子集,那详细有哪几种数据类型呢?
string:字符串,必须要用双引号引起来。
number:数值,与JavaScript的number同等,整数(不该用小数点或指数计数法)最多为 15 位,小数的最大位数是 17。
object:JavaScript的工具形式,{ key:value }表示办法,可嵌套。
array:数组,JavaScript的Array表示办法[ value ],可嵌套。
true/false:布尔类型,JavaScript的boolean类型。
:空值,JavaScript的。
以上数据形式图片来源JSON官方文档:http://www.json.org/json-zh.html
JSON利用场景
先容完JSON的数据格式,那我们来看看JSON在企业中利用的比较多的场景。
接口返回数据和序列化。JSON用的最多的地方莫过于Web了,现在的数据接口基本上都是返回的JSON,详细细化的场景有:
Ajxa异步访问数据
RPC远程调用
前后端分离后端返回的数据
开放API,如百度、高德等一些开放接口
企业间互助接口
这种API接口一样平常都会供应一个接口文档,解释接口的入参、出参等,
一样平常的接口返回数据都会封装成JSON格式,比如类似下面这种
{
\公众code\"大众: 1,
\公众msg\公众: \公众success\公众,
\"大众data\"大众: {
\"大众name\"大众: \"大众pig\"大众,
\"大众age\"大众: \公众18\"大众,
\"大众sex\"大众: \"大众man\公众,
\"大众hometown\"大众: {
\"大众province\公众: \公众江西省\公众,
\公众city\"大众: \公众抚州市\公众,
\"大众county\"大众: \公众崇仁县\"大众
}
}
}
程序在运行时所有的变量都是保存在内存当中的,如果涌现程序重启或者机器宕机的情形,那这些数据就丢失了。一样平常情形运行时变量并不是那么主要丢了就丢了,但有些内存中的数据是须要保存起来供下次程序或者其他程序利用。
保存内存中的数据要么保存在数据库,要么保存直接到文件中,而将内存中的数据变成可保存或可传输的数据的过程叫做序列化,在Python中叫pickling,在其他措辞中也被称之为serialization,marshalling,flattening等等,都是一个意思。
正常的序列化是将编程措辞中的工具直接转成可保存或可传输的,这样会保存工具的类型信息,而JSON序列化则不会保留工具类型!
为了让大家更直不雅观的感想熏染差异,猪哥用代码做一个测试,大家一览无余
Python工具直接序列化会保存class信息,下次利用loads加载到内存时直接变成Python工具。
JSON工具序列化只保存属性数据,不保留class信息,下次利用loads加载到内存可以直接转成dict工具,当然也可以转为Person工具,但是须要写赞助方法。
对付JSON序列化不能保存class信息的特点,那JSON序列化还有什么用?答案是当然有用,对付不同编程措辞序列化读取有用,比如:我用Python爬取数据然后转成工具,现在我须要将它序列化磁盘,然后利用Java措辞读取这份数据,这个时候由于跨措辞数据类型不同,以是就须要用到JSON序列化。
存在即合理,两种序列化可根据需求自行选择!
末了便是天生Token和配置文件
首先声明Token的形式多种多样,有JSON、字符串、数字等等,只要能知足需求即可,没有规定用哪种形式。
JSON格式的Token最有代表性的莫过于JWT(JSON Web Tokens)。
随着技能的发展,分布式web运用的遍及,通过Session管理用户登录状态本钱越来越高,因此逐步发展成为Token的办法做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后JWT的涌现,校验办法更加大略便捷化,无需通过Redis缓存,而是直接根据Token取出保存的用户信息,以及对Token可用性校验,单点登录更为大略。
利用JWT做过app的登录系统,大概的流程便是:
用户输入用户名密码
app要求登录中央验证用户名密码
如果验证通过则天生一个Token,个中Token中包含:
用户的uid、Token过期韶光、过期延期韶光等,然后返回给app
app得到Token,保存在cookie中,下次要求其他做事则带上
其他做事获取到Token之后调用登录中央接口验证
验证通过则相应
JWT登录认证有哪些上风:
性能好:做事器不须要保存大量的session
单点登录(登录一个运用,同一个企业的其他运用都可以访问):利用JWT做一个登录中央基本搞定,很随意马虎实现。
兼容性好:支持移动设备,支持跨程序调用,Cookie 是不许可垮域访问的,而 Token 则不存在这个问题。
安全性好:由于有署名,以是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作为配置文件格式。
JSON在Python中的利用
末了我们来看看Python中操作JSON的常用方法有哪些,在Python中操作JSON时须要引入json标准库。
import json
类型转换
Python类型转JSON:json.dump
# 1、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')
# 2、Python的列表类型转JSON
person_list = ['pig', 18, 'man', '江西抚州']
person_list_json = json.dumps(person_list)
print(person_list_json, '\n')
# 3、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
# 4、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')
# 5、JSON转Python的列表类型
person_json2 = '[\公众pig\公众, 18, \"大众man\公众, \"大众江西抚州\"大众]'
person_json_list = json.loads(person_json2)
print(type(person_json_list), '\n')
# 6、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中的哪些数据类型呢?
须要把稳的点
JSON的键名和字符串都必须利用双引号引起来,而Python中单引号也可以表示为字符串,以是这是个比较随意马虎犯的缺点!
Python类型与JSON相互转换的时候到底是用load/dump还是用loads\dumps?
他们之间有什么差异?
什么时候该加s什么时候不该加s?
这个我们可以通过查看源码找到答案:
不加s的方法入参多了一个fp表示filepath,末了多了一个写入文件的操作。
以是我们在影象的时候可以这样影象:
加s表示转成字符串(str),不加s表示转成文件。
Python自定义工具与JSON相互转换的时候须要赞助方法来指明属性与键名的对应关系,如果不指定一个方法则会抛出非常!
相信有些看的仔细的同学会好奇上面利用json.dumps方法将Python类型转JSON的时候,如果涌现中文,则会涌现:
\u6c5f\u897f\u629a\u5dde
这种东西,这是为什么呢?
缘故原由是:Python 3中的json在做dumps操作时,会将中文转换成unicode编码,并以16进制办法存储,而并不是UTF-8格式!
总结
本日我们学习了JSON的2种形式,牢记JSON还有[...]这种形式的。
学习了JSON的6种数据类型他们分别对付Python中的哪些类型。
理解了JSON的一些利用场景以及实际的例子。
还学习了在Python中如何利用JSON以及须要把稳的事变。
一个JSON知识点却分两篇长文(近万字)来讲,其主要性不言而喻。由于不管你是做爬虫、还是做数据剖析、web、乃至前端、测试、运维,JSON都是你必须要节制的一个知识点
本文为作者投稿,版权归作者个人所有。