使用Python处理JSON数据:json模块函数
在Python编程中,处理JSON数据是一项非常常见的任务。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,也是现代互联网中重要的数据传递格式之一。Python语言自带json模块可以轻松地读取、创建和处理JSON数据。
Python的json模块中包含了许多函数和类,可以完成与JSON文件的交互、字符串的转换、解析和序列化等任务。下面介绍一些json模块的主要函数和用法。
1. json.dumps()函数
json.dumps()函数用于将Python对象编码成JSON格式的字符串。它的基本语法如下:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
其中,obj表示要编码成JSON字符串的Python对象(如字典、列表、字符串等);skipkeys、ensure_ascii、check_circular、allow_nan、cls、indent、separators、default和sort_keys等均为可选参数。
例如,将一个Python字典对象转换为JSON格式的字符串如下:
import json
data = {'name': 'Tom', 'age': 18}
json_str = json.dumps(data)
print(json_str)
输出结果为:
{"name": "Tom", "age": 18}
在上面的代码中,json_str变量保存了Python字典对象data转换为的JSON字符串。注意,输出结果中双引号是JSON格式字符串的一部分,而不是Python字符串的一部分。
2. json.loads()函数
json.loads()函数用于将JSON格式的字符串(已经编码后的)解码为Python对象。它的基本语法如下:
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
其中,s表示要解码的JSON字符串;cls、object_hook、parse_float、parse_int、parse_constant、object_pairs_hook等均为可选参数。
例如,将一个JSON格式的字符串转换为Python对象如下:
import json
json_str = '{"name": "Tom", "age": 18}'
data = json.loads(json_str)
print(data)
输出结果为:
{'name': 'Tom', 'age': 18}
在上面的代码中,data变量保存了从JSON格式字符串转换而来的Python字典对象。注意,输出结果中单引号是Python字符串的一部分,而不是JSON格式字符串的一部分。
3. json.dump()函数
json.dump()函数用于将Python对象编码并写入文件。它的基本语法如下:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
其中,obj表示要编码成JSON格式的Python对象;fp表示要写入的文件对象,需要是可写文件(如TextIOWrapper对象);skipkeys、ensure_ascii、check_circular、allow_nan、cls、indent、separators、default和sort_keys等均为可选参数。
例如,将一个Python字典对象编码为JSON格式并写入文件如下:
import json
data = {'name': 'Tom', 'age': 18}
with open('data.json', 'w') as fp:
json.dump(data, fp)
在代码中,数据将被编码为JSON格式并写入data.json文件中。因为使用了with语句,所以文件操作完成后自动关闭文件。
4. json.load()函数
json.load()函数用于从文件中读取JSON数据并解码为Python对象。它的基本语法如下:
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
其中,fp表示要读取的文件对象,需要是可读文件(如TextIOWrapper对象);cls、object_hook、parse_float、parse_int、parse_constant、object_pairs_hook等均为可选参数。
例如,从一个JSON文件中读取数据并解码为Python对象如下:
import json
with open('data.json', 'r') as fp:
data = json.load(fp)
print(data)
在代码中,从data.json文件中读取JSON数据并解码为Python字典对象data。因为使用了with语句,所以文件操作完成后自动关闭文件。
5. json.JSONEncoder类
json.JSONEncoder类用于自定义JSON编码器,它默认支持对Python int、float、str、list、dict等类型进行编码。我们可以通过继承JSONEncoder类并重写default()方法来处理自定义对象的编码。
例如,我们定义一个Person类,并将其对象序列化为JSON格式:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Tom", 18)
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
else:
return super(MyEncoder, self).default(obj)
json_str = json.dumps(p, cls=MyEncoder)
print(json_str)
输出结果为:
{"name": "Tom", "age": 18}
在上面的代码中,我们定义了一个MyEncoder类继承自JSONEncoder,重写了default()方法,当遇到Person类型的对象时,将它转为一个包含name和age属性的字典,再由JSONEncoder进行编码操作。
6. json.JSONDecoder类
json.JSONDecoder类用于自定义JSON解码器,它默认支持对JSON对象进行解码。我们可以通过继承JSONDecoder类并重写decode()方法来处理特定类型的JSON数据解码。
例如,我们从文件中读取一个JSON格式的字符串,并将其中的日期类型("2022-05-26")转为date对象类型:
import json
from datetime import date
json_str = '{"name": "Tom", "birthday": "2022-05-26"}'
class MyDecoder(json.JSONDecoder):
def decode(self, s, **kwargs):
obj = json.loads(s, **kwargs)
if "birthday" in obj:
y, m, d = map(int, obj["birthday"].split("-"))
obj["birthday"] = date(y, m, d)
return obj
data = json.loads(json_str, cls=MyDecoder)
print(data)
print(type(data["birthday"]))
输出结果为:
{'name': 'Tom', 'birthday': datetime.date(2022, 5, 26)}
<class 'datetime.date'>
在上面的代码中,我们定义了一个MyDecoder类继承自JSONDecoder,重写了decode()方法,将读取到的JSON字符串解码为Python字典对象。当发现字典中有"birthday"键时,将其对应的字符串转为date对象。
7. 其他函数
在json模块中还有一些其他常用的函数,如:
- json.JSONEncoder.default()函数:该方法为JSONEncoder类的类方法,重写对自定义数据类型进行编码的处理。该方法接受Python对象,并返回一个JSON可以序列化的对象:
def default(self, obj):
if isinstance(obj, MyObj):
return {"myobj": obj.data}
return super().default(obj)
- json.JSONDecoder.object_hook()函数:该方法为JSONDecoder类的类方法,用于自定义JSON解码器,将字典数据恢复为自定义对象:
def object_hook(self, dic):
if 'myobj' in dic:
return MyObj(dic['myobj'])
return dic
- json.JSONDecoder.parse_float()、json.JSONDecoder.parse_int()、json.JSONDecoder.parse_constant()函数:这些函数是用于解析JSON字符串中的浮点数、整数和常数值,如果要定制默认解析方法,可以自己重写这些函数。
在Python编程中,json模块是一个非常重要的模块,可以很好地支持使用JSON格式来交
