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

Python JSON相关函数: dumps()、loads()、JSONEncoder()等

发布时间:2023-05-28 19:46:31

Python是一种功能强大的编程语言,它具有处理数据的高效性和优雅性。JSON作为一种轻量级数据交换格式,在Python中也得到了广泛的应用。Python提供了一些内置函数和模块,用于处理JSON数据,比如dumps()、loads()、JSONEncoder()等。在本文中,我们将探讨这些函数和模块。

1. dumps()函数

dumps() 是 Python 标准库 json 中的函数,是将 Python 对象编码成 JSON 字符串的主要方法。这个函数最常见的使用场景是将 Python 对象序列化成 JSON 字符串。

使用示例:

import json

data = {'name': 'Tom', 'age': 18}
json_str = json.dumps(data)
print(json_str)

输出:

{"name": "Tom", "age": 18}

从输出结果可以看到,使用dumps()将Python字典序列化成JSON字符串,这个字符串与Python字典十分类似,只是键和值之间使用了冒号,键值对之间使用了逗号,并且所有字符串都用双引号括起来。

当然,dumps()还支持一些参数,用于控制序列化过程。例如,indent参数用于设置JSON字符串的缩进量;sort_keys参数用于给键排序。可通过 help(json.dumps) 查看详细参数用法。

2. loads()函数

loads() 是 Python 标准库 json 中的函数,是将 JSON 字符串解码成 Python 对象的主要方法。这个函数最常见的使用场景是将 JSON 字符串反序列化成 Python 字典。

使用示例:

import json

json_str = '{"name": "Tom", "age": 18}'
data = json.loads(json_str)
print(data)

输出:

{'name': 'Tom', 'age': 18}

可以看到,使用loads()将JSON字符串反序列化成Python字典的过程非常简单,只需将JSON字符串作为参数传递给loads()函数即可。

同样地,loads()还支持一些参数,可通过 help(json.loads) 查看详细参数用法。

3. JSONEncoder()类

JSONEncoder() 是 Python 标准库 json 中的类,是将 Python 对象编码成 JSON 字符串的高级方法。这个类比dumps()更灵活,可以实现更高级的定制。

使用示例:

import json

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        return json.JSONEncoder.default(self, obj)

data = {'name': 'Tom', 'age': 18, 'hobbies': {'reading', 'jogging'}}

json_str = json.dumps(data, cls=CustomEncoder)

print(json_str)

输出:

{"name": "Tom", "age": 18, "hobbies": ["reading", "jogging"]}

在上面的示例中,我们自定义了一个CustomEncoder类,重写了JSONEncoder的默认方法 default(),对Python中的集合类型进行了特殊处理。由于JSON格式不支持集合类型,我们在 default() 方法中将集合转化成列表类型,然后再进行序列化。

使用JSONEncoder类时,可以除了使用default()方法,还可以添加其他方法,实现更高级的定制。比如,可以添加encode()方法,该方法接收一个Python对象作为参数,在编码为JSON字符串之前对其进行处理。

4. dump() 和 load() 函数

除了dumps()和loads()函数外,Python的json模块还提供了dump()和load()函数,用于将 Python 对象序列化成和反序列化成JSON格式的数据流。与dumps()和loads()函数不同的是,这两个函数可以方便地将数据流一次性写入或读取。

使用示例:

import json

data = {'name': 'Tom', 'age': 18}

with open('data.json', 'w') as f:
    json.dump(data, f)

with open('data.json') as f:
    data = json.load(f)

print(data)

通过dump()函数,我们将Python字典序列化成JSON格式的数据流,并一次性写入到文件data.json中。然后,通过load()函数,我们将JSON格式的数据流从文件data.json中读取,并反序列化成Python字典。

5. JSONDecoder()类

JSONDecoder() 是 Python 标准库 json 中的类,是将 JSON 字符串解码成 Python 对象的高级方法。该类也比loads()更灵活,可以实现更高级的定制。

使用示例:

import json

class CustomDecoder(json.JSONDecoder):
    def decode(self, s):
        placeholders = []
        def map_to_obj(data):
            obj = {}
            for key in data:
                if isinstance(data[key], str) and data[key].startswith('@'):
                    placeholders.append((obj, key, int(data[key][1:])))
                else:
                    obj[key] = data[key]
            return obj
        result = json.JSONDecoder.decode(self, s)
        while placeholders:
            obj, key, placeholder_idx = placeholders.pop()
            obj[key] = result[placeholder_idx]
        return result

json_str = '{"name": "Tom", "age": "@0", "job": {"position": "@1", "salary": "@2"}}'

data = [18, "Software Engineer", 2000000]

custom_obj = CustomDecoder().decode(json_str)

print(custom_obj)

在上面的示例中,我们自定义了一个CustomDecoder类,重写了JSONDecoder的默认方法 decode(),实现将 JSON 格式的字符串中的占位符(如"@0")替换成其他数据。该类可以实现复杂的定制,比loads()函数和默认JSONDecoder类更加强大。

6. 总结

Python提供了很多内置函数和模块用于处理JSON数据,其中dumps()、loads()、JSONEncoder()、dump()、load()和JSONDecoder()是最常用的方法。通过这些方法,我们可以轻松地将 Python 对象序列化成 JSON 字符串、将 JSON 字符串反序列化成 Python 对象,或者将数据写入和读取从JSON格式的数据流中。如果默认方法不能满足需求,我们还可以通过自定义JSONEncoder()和JSONDecoder()类实现更高级的定制。