JSON的使用场景及注意事项介绍 (2)

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')

执行结果如下:

在这里插入图片描述

2.对应的数据类型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgddw.html