json模块主要用来进行python对象的序列化和反序列化。
方法 | 含义 |
json.dumps() | 将python对象序列化为json格式的字符串 |
json.loads() | 将包含json格式数据的字符串反序列化成python对象 |
json.dump() | 将python对象序列化为json格式的数据流并写入文件类型的对象中 |
json.load() | 从文件类型的对象中读取json格式的数据并反序列化成python对象 |
python | JSON |
dict | object |
list、tuple | array |
str | string |
int、float | number |
True | true |
False | false |
None | null |
JSON | python |
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
# 包含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"}'
message = '我爱Python3' # ensure_ascii参数默认值为True,将会把非ascii字符转移成unicode字符串'"\\u6211\\u7231Python3"' json.dumps(message) # ensure_ascii参数设置为False时,不会进行转义'"我爱Python3"' json.dumps(message, ensure_ascii=False)
emp_dict = {'id': 1, 'dept': 'sales'} # 字典中包含循环引用 emp_dict['info'] = emp_dict # 默认进行循环引用的检查,将引发ValueError异常 json.dumps(emp_dict) # 设置为不进行循环引用的检查,但是在编码Json对象时仍然引发了异常 json.dumps(emp_dict, check_circular=False)
>>> 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
含义:接受一个可调用对象,用于处理解码后生成的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)])]]
含义:用于处理解码后的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']