JSON对象序列化只保存属性数据,不保留class信息,下次使用loads加载到内存可以直接转成dict对象,当然也可以转为Person对象,但是需要写辅助方法。
对于JSON序列化不能保存class信息的特点,那JSON序列化还有什么用?答案是当然游有用,对于不同编程语言序列化读取有用,比如:我用Python爬取数据然后转成对象,现在我需要将它序列化磁盘,然后使用Java语言读取这份数据,这个时候由于跨语言数据类型不同,所以就需要用到JSON序列化。
存在即合理,两种序列化可根据需求自行选择!
3.生成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相关知识自行在网上学习,本文不过多介绍!
4.配置文件说实话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 1.类型转换1、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')执行结果:
2、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')执行结果如下: