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

2023年 7月 12日 51.1k 0

json模块主要用来进行python对象的序列化和反序列化。

  • 常用方法
  • 不带s的都是设计存入文件的持久化的操作。
  • 带s的操作都是在内存中执行的,不涉及到持久化。
  • 方法 含义
    json.dumps() 将python对象序列化为json格式的字符串
    json.loads() 将包含json格式数据的字符串反序列化成python对象
    json.dump() 将python对象序列化为json格式的数据流并写入文件类型的对象中
    json.load() 从文件类型的对象中读取json格式的数据并反序列化成python对象
  • 序列化时,python类型与json类型的转换关系
  • python JSON
    dict object
    list、tuple array
    str string
    int、float number
    True true
    False false
    None null
  • 反序列化时,json类型与python类型的转换关系
  • JSON python
    object dict
    array list
    string str
    number(int) int
    number(real) float
    true True
    false False
    null None
  • 函数内的参数
  • json.dumps()与json.dump()方法
  • skipkeys=False(默认)
  • 含义:是否跳过要序列化的对象中字典元素key的值不是基本类型的数据;
  • 默认为flase,抛出异常;
  • 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"}'

  • ensure_ascii=True(默认)
  • 含义:是否将要序列化的对象中的字符串内的非ascii字符进行转义;
  • 默认参数为true,将字符串中的非ascii字符转义为unicode字符串;
  • false则不会进行转义;
  • message = '我爱Python3' # ensure_ascii参数默认值为True,将会把非ascii字符转移成unicode字符串'"\\u6211\\u7231Python3"' json.dumps(message) # ensure_ascii参数设置为False时,不会进行转义'"我爱Python3"' json.dumps(message, ensure_ascii=False)

  • check_circular=True(默认)
  • 含义:是否进行容器类型的循环引用检查;
  • 若参数为False,则不进行检查,但是有可能会引发overflowError或更严重的问题;
  • 若参数为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)

  • allow_nan=True(默认)
  • 含义:是否允许序列化超出范围的float类型的值(如float('int')、float('-int')、float('nan'));
  • 若参数为True,则上面列出的那些值将依次使用JavaScript中等价的值(Infinity、-Infinity、NaN)来进 行替代;
  • 若参数为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

  • json.loads()与json.load()方法
  • 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)])]]

  • 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']

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论