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

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

  1. 常用方法
  2. 不带s的都是设计存入文件的持久化的操作。
  3. 带s的操作都是在内存中执行的,不涉及到持久化。
方法 含义
json.dumps() 将python对象序列化为json格式的字符串
json.loads() 将包含json格式数据的字符串反序列化成python对象
json.dump() 将python对象序列化为json格式的数据流并写入文件类型的对象中
json.load() 从文件类型的对象中读取json格式的数据并反序列化成python对象
  1. 序列化时,python类型与json类型的转换关系
python JSON
dict object
list、tuple array
str string
int、float number
True true
False false
None null
  1. 反序列化时,json类型与python类型的转换关系
JSON python
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None
  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"}'

  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)

  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)

  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

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

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

THE END