Python json库的使用
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,常用于前后端之间的数据交换。Python中提供了json库用于将Python对象转换成JSON格式的字符串,或将JSON格式的字符串转换成Python对象。
JSON格式
先来看一下JSON格式的规则。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象
- 方括号保存数组
以下是一个简单的JSON对象的例子:
{
"name": "John",
"age": 30,
"city": "New York"
}
使用json库将Python对象转JSON字符串
json库中的dumps()
方法用于将Python对象转换为JSON格式的字符串。
例如,将一个字典对象转换为JSON字符串:
import json
dict_obj = {'name': 'John', 'age': 30, 'city': 'New York'}
json_str = json.dumps(dict_obj)
print(json_str)
# 输出:{"name": "John", "age": 30, "city": "New York"}
在上面的代码中,通过dumps()
方法将一个字典对象转换为JSON格式的字符串。该方法的参数dict_obj
指定要转换的Python对象。
使用json库将JSON字符串转Python对象
json库中的loads()
方法用于将JSON格式的字符串转换为Python对象。
例如,将一个JSON字符串转换为Python对象:
import json
json_str = '{"name": "John", "age": 30, "city": "New York"}'
dict_obj = json.loads(json_str)
print(dict_obj)
# 输出:{'name': 'John', 'age': 30, 'city': 'New York'}
在上面的代码中,通过loads()
方法将一个JSON格式的字符串转换为Python对象。该方法的参数json_str
指定要转换的JSON字符串。
读取JSON文件内容
将JSON格式的数据保存在文件中后,可以使用json库读取并转换为Python对象。
例如,读取data.json
文件中的数据:
import json
with open('data.json', 'r') as f:
json_str = f.read()
dict_obj = json.loads(json_str)
print(dict_obj)
# 输出:{'name': 'John', 'age': 30, 'city': 'New York'}
在上面的代码中,使用open()
函数打开data.json
文件,并通过read()
方法读取JSON字符串。然后使用json库中的loads()
方法将JSON字符串转换为Python对象。
写入Python对象到JSON文件
使用json库还可以将Python对象写入到JSON文件中。
例如,将一个Python对象写入到data.json
文件中:
import json
dict_obj = {'name': 'John', 'age': 30, 'city': 'New York'}
with open('data.json', 'w') as f:
json.dump(dict_obj, f)
在上面的代码中,使用json.dump()
方法将Python对象dict_obj
写入到data.json
文件中。该方法的参数f
指定保存数据的文件对象。
自定义JSON编码器
在将Python对象转换为JSON字符串时,json库提供了默认的编码规则。如果需要特定的编码规则,可以自定义JSON编码器。自定义编码器是通过继承json.JSONEncoder
来实现的。
例如,将一个自定义的类Person
转换为JSON字符串:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
return super().default(obj)
person_obj = Person("John", 30)
json_str = json.dumps(person_obj, cls=PersonEncoder)
print(json_str)
# 输出:{"name": "John", "age": 30}
在上面的代码中,自定义了一个类Person
,并继承了json.JSONEncoder
,实现了一个default()
方法。该方法在转换Python对象为JSON字符串时被调用,如果对象是Person
类的实例,就将其转换为JSON格式。否则,调用父类的default()
方法,在转换为默认格式的JSON字符串。
在将person_obj
对象转换为JSON字符串时,通过cls
参数指定使用自定义的编码器PersonEncoder
。
自定义JSON解码器
在将JSON字符串转换为Python对象时,json库提供了默认的解码规则。如果需要特定的解码规则,可以自定义JSON解码器。自定义解码器是通过继承json.JSONDecoder
来实现的。
例如,自定义解码器将JSON字符串转换为一个自定义的类Person
:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonDecoder(json.JSONDecoder):
def decode(self, json_str):
dict_obj = json.loads(json_str)
return Person(dict_obj["name"], dict_obj["age"])
json_str = '{"name": "John", "age": 30}'
person_obj = json.loads(json_str, cls=PersonDecoder)
print(person_obj.name)
print(person_obj.age)
# 输出:
# John
# 30
在上面的代码中,自定义了一个类Person
,并继承了json.JSONDecoder
,实现了一个decode()
方法。该方法在将JSON字符串转换为Python对象时被调用,将JSON格式的字典转换为Person
类的实例。
在将json_str
字符串转换为Python对象时,通过cls
参数指定使用自定义的解码器PersonDecoder
。
小结
本文介绍了Python json库的基本用法,包括将Python对象转换成JSON字符串,将JSON字符串转换成Python对象,读取JSON文件内容以及将Python对象写入JSON文件中。还介绍了如何自定义JSON编码器和解码器。
json库的简单易用,既方便又灵活,适合用于前后端数据交换、数据存储等场景。