当我们需要在不同的技术栈之间交换数据时,我们需要一种简便易行的方式,以确保数据格式的一致性。在Python中,JSON(JavaScript Object Notation)是一种流行的格式,它被广泛用于数据交换,因为它易于阅读和理解,并且它的轻量性可以轻松地处理大量数据。Python中有一个标准库模块json库专门用于JSON的编码和解码。
基本用法
json.dumps方法将Python对象(比如list, tuple, dict等)转换为一个JSON格式的字符串,而json.loads方法将JSON格式的字符串转换为Python对象。
下面,让我们看一个简单的示例。
import json
python_object = {
"name": "Alice",
"age": 25,
"languages": ["Python", "JavaScript", "Golang"],
"married": False
}
json_string = json.dumps(python_object)
print(json_string)
在这个示例中,我们需要导入json模块,然后定义一个Python对象,并使用dumps()方法将它转换为一个JSON格式的字符串。最后,我们可以打印输出这个JSON字符串。
输出结果为:
{"name": "Alice", "age": 25, "languages": ["Python", "JavaScript", "Golang"], "married": false}
你可以看到,输出结果是一个JSON格式的字符串。
下面是将JSON格式的字符串转换为Python对象的实例代码:
import json
json_string = '{"name": "Alice", "age": 25, "languages": ["Python", "JavaScript", "Golang"], "married": false}'
python_object = json.loads(json_string)
print(python_object)
在这个示例中,我们使用loads()函数将JSON格式的字符串转换为Python对象,并打印输出该Python对象。
输出结果为:
{'name': 'Alice', 'age': 25, 'languages': ['Python', 'JavaScript', 'Golang'], 'married': False}
你可以看到,输出结果是Python对象。注意,输出结果中,所有的字符串都被转化为了Python字符类型的数据。数字类型和布尔类型也被正确地转换成了Python的数字类型和布尔类型。同时,列表也被正确转换为了Python列表。
高级用法
在Python中,除了基本的数据类型,还有一些特殊的数据类型,其中包括datetime类型和自定义类对象。在这种情况下,我们需要使用json模块的另外两个函数:json.JSONEncoder.default()和json.JSONDecoder.object_hook()。
下面,让我们看几个案例。
自定义datetime类型
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
return super().default(obj)
# Python对象
my_object = {
"name": "Bob",
"age": 18,
"birthday": datetime(2003, 8, 15)
}
# 自定义Encoder
encoder = CustomEncoder()
# 转换为JSON格式的字符串
json_string = encoder.encode(my_object)
print(json_string)
在这个示例中,我们定义了一个CustomEncoder类,该类继承自json.JSONEncoder类,并覆盖了default()方法来处理datetime类型的值。我们还定义了一个Python对象,其中包括datetime类型的值,然后使用我们定义的CustomEncoder将其转换为JSON格式的字符串。
输出结果为:
{"name": "Bob", "age": 18, "birthday": "2003-08-15 00:00:00"}
你可以看到,输出结果中,datetime类型的值已经被正确转换为了字符串类型的数据。
自定义类对象
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Name: {self.name}, Age: {self.age}'
class PersonDecoder(json.JSONDecoder):
def object_hook(self, dct):
if '_type' in dct and dct['_type'] == 'person':
return Person(dct['name'], dct['age'])
return dct
person = Person("Tom", 20)
# 转化为JSON格式字符串
json_string = json.dumps({"person": person.__dict__, "_type": "person"})
# 自定义Decoder
decoder = PersonDecoder()
# JSON字符串转Python对象
result = decoder.decode(json_string)
print(result)
在这个示例中,我们定义了一个名为Person的类对象,它有两个属性:name和age,并定义了一个__str__()方法,用于打印Person对象的数据。我们还定义了一个PersonDecoder类,该类继承自json.JSONDecoder类,并覆盖了object_hook()方法来处理Person类对象的转换。我们还创建了一个Person对象,然后使用json.dumps()将其转换为JSON格式的字符串,并传递了一个包含对象类型的键"_type"。
最后,我们使用我们定义的PersonDecoder类解码JSON格式的字符串,并获得一个新的Person对象,并输出它的数据。
输出结果为:
Name: Tom, Age: 20
你可以看到,输出结果中,Python对象已经被正确地还原为自定义的类对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python标准库模块之json库的基础用法 - Python技术站