json
库详解json
库?json
库是Python的标准库,用于处理JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,常用于客户端与服务器之间的数据传输。json
库提供了将Python对象与JSON格式的数据相互转换的功能。
json
库常用于以下场景:
json
库的基本APIjson.dumps()
- Python对象转JSON字符串json.dumps()
用于将Python对象转换为JSON格式的字符串。
语法:
import json
json_string = json.dumps(obj, indent=None, separators=None, ensure_ascii=True)
参数说明:
obj
: 要转换为JSON字符串的Python对象。indent
: (可选)用于指定缩进级别,便于美观输出。separators
: (可选)用于指定键值对之间的分隔符。ensure_ascii
: (可选)默认为True,非ASCII字符会被转义。示例:
import json
data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_string = json.dumps(data, indent=4) # 美观输出,缩进4个空格
print(json_string)
输出:
{
"name": "John",
"age": 30,
"city": "New York"
}
使用场景:
json.loads()
- JSON字符串转Python对象json.loads()
用于将JSON格式的字符串转换为Python对象。
语法:
import json
obj = json.loads(json_string)
参数说明:
json_string
: 要转换的JSON格式字符串。示例:
import json
json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data)
输出:
{'name': 'John', 'age': 30, 'city': 'New York'}
使用场景:
json.dump()
- Python对象转JSON并写入文件json.dump()
用于将Python对象转换为JSON格式,并写入到文件中。
语法:
import json
json.dump(obj, file, indent=None, separators=None, ensure_ascii=True)
参数说明:
obj
: 要转换的Python对象。file
: 文件对象,用于保存JSON数据。indent
: (可选)用于指定缩进级别,便于美观输出。separators
: (可选)用于指定键值对之间的分隔符。ensure_ascii
: (可选)默认为True,非ASCII字符会被转义。示例:
import json
data = {'name': 'John', 'age': 30, 'city': 'New York'}
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
输出:
执行完毕后,会在当前目录下生成一个data.json
文件,文件内容如下:
{
"name": "John",
"age": 30,
"city": "New York"
}
使用场景:
json.load()
- 从文件中读取JSON并转为Python对象json.load()
用于从文件中读取JSON格式的数据,并将其转换为Python对象。
语法:
import json
obj = json.load(file)
参数说明:
file
: 包含JSON数据的文件对象。示例:
import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
输出:
{'name': 'John', 'age': 30, 'city': 'New York'}
使用场景:
json
库不仅可以处理简单的字典和列表,还可以处理更复杂的嵌套数据结构。
import json
data = {
'user': {
'name': 'John',
'age': 30,
'contacts': [
{'type': 'email', 'value': '[email protected]'},
{'type': 'phone', 'value': '123-456-7890'}
]
}
}
json_string = json.dumps(data, indent=4)
print(json_string)
输出:
{
"user": {
"name": "John",
"age": 30,
"contacts": [
{
"type": "email",
"value": "[email protected]"
},
{
"type": "phone",
"value": "123-456-7890"
}
]
}
}
在处理一些无法直接序列化的对象时,可以通过自定义编码器解决。通过继承json.JSONEncoder
或实现default()
方法,定义如何将复杂对象转换为可序列化的形式。
示例:
import json
from datetime import datetime
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {'time': datetime.now()}
json_string = json.dumps(data, cls=DateTimeEncoder)
print(json_string)
输出:
{
"time": "2024-08-24T15:30:00.123456"
}
(输出的日期和时间根据当前时间会有所不同)
对于大型数据集或网络数据流,可以使用json
库处理一行一行的JSON对象,避免一次性加载全部数据。
示例:
import json
with open('large_data.json') as file:
for line in file:
obj = json.loads(line)
print(obj)
输出:
假设large_data.json
文件中的内容为:
{"name": "Alice", "age": 25}
{"name": "Bob", "age": 22}
则执行后输出:
{'name': 'Alice', 'age': 25}
{'name': 'Bob', 'age': 22}
使用indent
参数可以使JSON字符串输出更具可读性,适合调试或存储配置文件。
json_string = json.dumps(data, indent=4)
输出:
{
"name": "John",
"age": 30,
"city": "New York"
}
在序列化时,可以使用sort_keys
参数将输出的JSON对象的键按字母顺序排序。
json_string = json.dumps(data, sort_keys=True, indent=4)
输出:
{
"age": 30,
"city": "New York",
"name": "John"
}
默认情况下,json
库会将非ASCII字符转义。可以通过设置ensure_ascii=False
来保留原始字符。
data = {'name': 'José'}
json_string = json.dumps(data, ensure_ascii=False)
输出:
{"name": "José"}
在反序列化时,如果遇到格式错误的JSON数据,可以捕获异常并进行处理。
import json
json_string = '{"name": "John", "age": 30, "city": "New York"'
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f'JSON decode error: {e}')
输出:
JSON decode error: Expecting ',' delimiter: line 1 column 45 (char 44)
json
库提供了强大的功能来处理JSON格式的数据。dumps()
、loads()
、dump()
和load()
。json
库表现得非常灵活。