欢迎访问宙启技术站
智能推送

使用Python处理JSON数据:json模块函数

发布时间:2023-05-30 05:23:07

在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格式来交