概述
在上一节,我们介绍了如何在Python中使用xml,包括:SAX、DOM、ElementTree等内容。在这一节,我们将介绍如何在Python中使用Json。Json的英文全称为JavaScript Object Notation,中文为JavaScript对象表示法,是一种存储和交换文本信息的语法,类似XML。Json作为轻量级的文本数据交换格式,比XML更小、更快,更易解析,也更易于阅读和编写。
在Python中使用Json非常简单,因为Python有一个内置的json模块,可以专门用来处理Json数据。
Json序列化
在Python中,可以使用json模块将Python对象序列化为Json字符串,这个过程我们称为Json序列化。
import json data = { 'Name': 'Lucy', 'Age': 18, 'City': 'London' } json_data = json.dumps(data) # 输出:{"Name": "Lucy", "Age": 18, "City": "London"} print(json_data)
在上面的示例代码中,我们首先导入了json模块,然后创建了一个字典data,最后使用json.dumps()函数将这个字典转换为Json字符串。
Json反序列化
在Python中,可以使用json模块将Json字符串反序列化为Python对象,这个过程我们称为Json反序列化。
import json json_data = '{"Name": "Lucy", "Age": 18, "City": "London"}' data = json.loads(json_data) # 输出:{'Name': 'Lucy', 'Age': 18, 'City': 'London'} print(data)
在上面的示例代码中,我们首先导入了json模块,然后创建了一个Json字符串json_data,最后使用json.loads()函数将这个Json字符串转换为了Python的字典。
注意:json.loads()函数只能将Json字符串转换为Python对象,而不能直接将Json数据转换为Python对象。如果有一个从网络或文件读取的Json数据,你需要先将其转换为字符串,然后再使用json.loads()函数进行反序列化。
读Json文件
在Python中,可以使用json模块从文件中读取Json数据,并将其反序列化为Python对象。
import json with open('test.json', 'r') as file: data = json.load(file) print(data)
在上面的示例代码中,我们首先导入了json模块,然后使用open()函数打开了一个名为test.json 的文件,最后使用json.load()函数从文件中读取Json数据,并将其转换为Python对象。注意:需要确保Json数据是有效的,否则 会抛出json.decoder.JSONDecodeError异常。
写Json文件
在Python中,可以使用json模块将Python对象序列化为Json字符串,并将该字符串写入文件。
import json data = { 'Name': 'Lucy', 'Age': 18, 'City': 'London' } with open('test.json', 'w') as file: json.dump(data, file)
在上面的示例代码中,我们首先导入了json模块,然后创建了一个字典data,最后使用json.dump()函数将字典data序列化为Json字符串,并将该字符串写入文件。
将类对象转换为Json
在Python中,可以使用自定义的JSONEncoder类将类对象转换为Json。 import json from datetime import datetime class Person: def __init__(self, name, birth_date): self.name = name self.birth_date = birth_date class PersonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Person): return { 'Name': obj.name, 'Birth_date': obj.birth_date.strftime('%Y-%m-%d') if obj.birth_date else None } return super().default(obj) person = Person('Lucy', datetime.now()) json_str = json.dumps(person, cls = PersonEncoder) # 输出:{"Name": "Lucy", "Birth_date": "2023-09-03"} print(json_str)
在上面的示例代码中,我们首先定义了一个名为Person的类,然后创建了一个该类的实例。接下来,我们定义了一个名为PersonEncoder的子类,继承自json.JSONEncoder,并重写了其default方法。该方法会检查传入的对象是否是Person的实例,如果是,则将其转换为一个字典,该字典包含对象的所有属性。最后,我们使用json.dumps()函数将对象转换为Json字符串,并将cls参数设置为PersonEncoder,以便使用我们自定义的编码方式。
将Json转换为类对象
在Python中,可以使用自定义的JSONDecoder类将Json转换为类对象。 import json from datetime import datetime class Person: def __init__(self, name, birth_date): self.name = name self.birth_date = birth_date def custom_object_hook(obj): return Person(obj['name'], datetime.strptime(obj['birth_date'], '%Y-%m-%d')) json_str = '{"name": "Lucy", "birth_date": "2022-02-02"}' decoder = json.JSONDecoder(object_hook = custom_object_hook) person = decoder.decode(json_str) # 输出:Lucy 2022-02-02 00:00:00 print(person.name, person.birth_date)
在上面的示例代码中,我们首先定义了一个名为Person的类和一个名为custom_object_hook的函数,该函数将对象转换为类的实例。然后,创建了一个json.JSONDecoder对象,并传递了custom_object_hook函数作为参数。最后,我们使用decode方法解析了一个Json字符串,将其转换为Python的字典类型,并通过custom_object_hook函数转换为Person类对象。