Python JSON相关函数: dumps()、loads()、JSONEncoder()等
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()类实现更高级的定制。
