python常用模块学习:json实例教程

2023-02-0113:42:38编程语言入门到精通Comments1,142 views字数 3023阅读模式

json模块主要用来进行python对象的序列化和反序列化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. 常用方法
  2. 不带s的都是设计存入文件的持久化的操作。
  3. 带s的操作都是在内存中执行的,不涉及到持久化。
方法含义
json.dumps()将python对象序列化为json格式的字符串
json.loads()将包含json格式数据的字符串反序列化成python对象
json.dump()将python对象序列化为json格式的数据流并写入文件类型的对象中
json.load()从文件类型的对象中读取json格式的数据并反序列化成python对象
  1. 序列化时,python类型与json类型的转换关系
pythonJSON
dictobject
list、tuplearray
strstring
int、floatnumber
Truetrue
Falsefalse
Nonenull
  1. 反序列化时,json类型与python类型的转换关系
JSONpython
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone
  1. 函数内的参数
  2. json.dumps()与json.dump()方法
  3. skipkeys=False(默认)
  4. 含义:是否跳过要序列化的对象中字典元素key的值不是基本类型的数据;
  5. 默认为flase,抛出异常;
  6. true则跳过;

# 包含key为bytes类型的元素 emp_info = {'name': 'bob', b'age': 24} # skipkeys参数为默认值False,故代码运行抛出异常 json.dumps(emp_info) return _iterencode(o, 0) TypeError: keys must be str, int, float, bool or None, not bytes # skipkeys参数设置为True时则可成功序列化 json.dumps(emp_info, skipkeys=True) '{"name": "bob"}'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. ensure_ascii=True(默认)
  2. 含义:是否将要序列化的对象中的字符串内的非ascii字符进行转义;
  3. 默认参数为true,将字符串中的非ascii字符转义为unicode字符串;
  4. false则不会进行转义;

message = '我爱Python3' # ensure_ascii参数默认值为True,将会把非ascii字符转移成unicode字符串'"\\u6211\\u7231Python3"' json.dumps(message) # ensure_ascii参数设置为False时,不会进行转义'"我爱Python3"' json.dumps(message, ensure_ascii=False)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. check_circular=True(默认)
  2. 含义:是否进行容器类型的循环引用检查;
  3. 若参数为False,则不进行检查,但是有可能会引发overflowError或更严重的问题;
  4. 若参数为True,则将进行容器类型的循环引用检查,并在发现循环引用时抛出异常;

emp_dict = {'id': 1, 'dept': 'sales'} # 字典中包含循环引用 emp_dict['info'] = emp_dict # 默认进行循环引用的检查,将引发ValueError异常 json.dumps(emp_dict) # 设置为不进行循环引用的检查,但是在编码Json对象时仍然引发了异常 json.dumps(emp_dict, check_circular=False)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. allow_nan=True(默认)
  2. 含义:是否允许序列化超出范围的float类型的值(如float('int')、float('-int')、float('nan'));
  3. 若参数为True,则上面列出的那些值将依次使用JavaScript中等价的值(Infinity、-Infinity、NaN)来进 行替代;
  4. 若参数为Flase,并且要序列化的对象中出现了那些超出范围的值,则将引发ValueError异常。

>>> num_list = [2, 5, float('inf'), float('-inf'), float('nan')] # allow_nan的值默认为True,列表中后三个值将被替换为js中等价的值 >>> json.dumps(num_list) '[2, 5, Infinity, -Infinity, NaN]' # allow_nan设置为False,引发ValueError异常 >>> json.dumps(num_list, allow_nan=False) ValueError: Out of range float values are not JSON compliant文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. json.loads()与json.load()方法
  2. object_hook=None

含义:接受一个可调用对象,用于处理解码后生成的python对象中dict类型的值;
注:这个处理过程是递归进行的,即返回的python对象内部所有的字典结构都将被这个方法处理。
>>> emp_info = {'name': 'bob', 'age': 25, 'gender': 'Male'} >>> def obj_hook(_dict): ... return list(_dict.items()) ... >>> json.loads(json.dumps(emp_info)) {'name': 'bob', 'age': 25, 'gender': 'Male'} >>> json.loads(json.dumps(emp_info), object_hook=obj_hook) [('name', 'bob'), ('age', 25), ('gender', 'Male')] >>> emp_list = [25, emp_info] >>> emp_list [25, {'name': 'bob', 'age': 25, 'gender': 'Male'}] >>> json.loads(json.dumps(emp_list),object_hook=obj_hook) [25, [('name', 'bob'), ('age', 25), ('gender', 'Male')]] >>> emp_d = [25, {'name': 'bob', 'age': 25, 'gender': 'Male', 'emp_info': {'count': 9, 'total_salary': 120000}}] >>> json.loads(json.dumps(emp_d),object_hook=obj_hook) [25, [('name', 'bob'), ('age', 25), ('gender', 'Male'), ('emp_info', [('count', 9), ('total_salary', 120000)])]]文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  1. parse_float=None

含义:用于处理解码后的Python对象中的float类型的值。
# 将解码后的所有的float类型的值转成int类型 >>> json.loads('[23.5, 43.32, 5.934]', parse_float=lambda x: int(x)) [23, 43, 5] # 将解码后的所有的float类型的值转成str类型 >>> json.loads('[23.5, 43.32, 5.934]', parse_float=lambda x: str(x)) ['23.5', '43.32', '5.934']文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/30671.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/30671.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定