互联网技术都应该了解的一种数据格式——JSON
一、JSON格式
1.JSON的2种结构形式
2.JOSN的6种数据类型
二、JSON使用场景
1.接口返回数据
2.序列化
3.生成Token
4.配置文件
三、JSON在Python中的使用
1.类型转换
2.对应的数据类型
3.需要注意的点
四、总结
一、JSON格式
1.JSON的2种结构形式
{
"person": {
"name": "pig",
"age": "18",
"sex": "man",
"hometown": {
"province": "江西省",
"city": "抚州市",
"county": "崇仁县"
}
}
}
["pig", 18, "man", "江西省抚州市崇仁县"]
2.JOSN的6种数据类型
string:字符串,必须要用双引号引起来。
number:数值,与JavaScript的number一致,整数(不使用小数点或指数计数法)最多为 15 位,小数的最大位数是 17。
object:JavaScript的对象形式,{ key:value }表示方式,可嵌套。
array:数组,JavaScript的Array表示方式[ value ],可嵌套。
true/false:布尔类型,JavaScript的boolean类型。
null:空值,JavaScript的null。
以上数据形式图片来源JSON官方文档:http://www.json.org/json-zh.html
二、JSON使用场景
1.接口返回数据
-
Ajxa异步访问数据 -
RPC远程调用 -
前后端分离后端返回的数据 -
开放API,如百度、高德等一些开放接口 -
企业间合作接口
一般的接口返回数据都会封装成JSON格式,比如类似下面这种
{
"code": 1,
"msg": "success",
"data": {
"name": "pig",
"age": "18",
"sex": "man",
"hometown": {
"province": "江西省",
"city": "抚州市",
"county": "崇仁县"
}
}
}
2.序列化
-
Python对象直接序列化会保存class信息,下次使用loads加载到内存时直接变成Python对象。 -
JSON对象序列化只保存属性数据,不保留class信息,下次使用loads加载到内存可以直接转成dict对象,当然也可以转为Person对象,但是需要写辅助方法。
3.生成Token
随着技术的发展,分布式web应用的普及,通过Session管理用户登录状态成本越来越高,因此慢慢发展成为Token的方式做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后JWT的出现,校验方式更加简单便捷化,无需通过Redis缓存,而是直接根据Token取出保存的用户信息,以及对Token可用性校验,单点登录更为简单。
猪哥也曾经使用JWT做过app的登录系统,大概的流程就是:
-
用户输入用户名密码 -
app请求登录中心验证用户名密码 -
如果验证通过则生成一个Token,其中Token中包含: 用户的uid、Token过期时间、过期延期时间等,然后返回给app -
app获得Token,保存在cookie中,下次请求其他服务则带上 -
其他服务获取到Token之后调用登录中心接口验证 -
验证通过则响应
性能好:服务器不需要保存大量的session
单点登录(登录一个应用,同一个企业的其他应用都可以访问):使用JWT做一个登录中心基本搞定,很容易实现。
兼容性好:支持移动设备,支持跨程序调用,Cookie 是不允许垮域访问的,而 Token 则不存在这个问题。
安全性好:因为有签名,所以JWT可以防止被篡改。
4.配置文件
{
"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在Python中的使用
json
标准库。
import json
1.类型转换
# 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')
# 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')
2.对应的数据类型
3.需要注意的点
-
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格式!
四、总结
[...]
这种形式的。