[序列化/Python] Python第三方库(json库):处理json数据
json库:处理json数据的Python实现
什么是json库?
- 
json库是Python的标准库,用于处理JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,常用于客户端与服务器之间的数据传输。json库提供了将Python对象与JSON格式的数据相互转换的功能。
- 
为什么要使用JSON? 
- 易读性高:JSON使用键值对存储数据,结构清晰,易于理解。
- 跨语言支持:JSON格式广泛支持于各种编程语言,方便数据交换。
- 轻量级:与XML相比,JSON格式更简洁,占用空间小。
使用场景
- json库常用于以下场景:
- API数据传输:在客户端与服务器之间进行数据交换时,常使用JSON格式进行传输。
- 配置文件:使用JSON格式保存程序的配置信息,便于读取和修改。
- 数据存储:在简单的数据存储场景下,可以使用JSON文件保存数据。
- 序列化与反序列化:将Python对象转换为JSON字符串,便于存储或传输;反之亦然。
基础API
json.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)
output
{
    "name": "John",
    "age": 30,
    "city": "New York"
}
- 使用场景:
- 将Python数据转换为JSON字符串,便于存储或通过网络传输。
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)
output
{'name': 'John', 'age': 30, 'city': 'New York'}
- 使用场景:
- 将从文件或网络读取的JSON字符串转换为Python对象,便于进一步处理。
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)
output : 执行完毕后,会在当前目录下生成一个
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)
output
{'name': 'John', 'age': 30, 'city': 'New York'}
- 使用场景:
- 从JSON文件中读取数据并转换为Python对象,便于程序中使用。
进阶用法
处理复杂数据结构
- json库不仅可以处理简单的字典和列表,还可以处理更复杂的嵌套数据结构。
import json
data = {
    'user': {
        'name': 'John',
        'age': 30,
        'contacts': [
            {'type': 'email', 'value': 'john@example.com'},
            {'type': 'phone', 'value': '123-456-7890'}
        ]
    }
}
json_string = json.dumps(data, indent=4)
print(json_string)
output
{
    "user": {
        "name": "John",
        "age": 30,
        "contacts": [
            {
                "type": "email",
                "value": "john@example.com"
            },
            {
                "type": "phone",
                "value": "123-456-7890"
            }
        ]
    }
}
自定义JSON编码器和解码器
- 
在处理一些无法直接序列化的对象时,可以通过自定义编码器解决。通过继承 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)
output
{
    "time": "2024-08-24T15:30:00.123456"
}
(输出的日期和时间根据当前时间会有所不同)
解析与处理JSON流
- 
对于大型数据集或网络数据流,可以使用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}
常用技巧
JSON格式的美观输出
- 使用indent参数可以使JSON字符串输出更具可读性,适合调试或存储配置文件。
json_string = json.dumps(data, indent=4)
output
{
    "name": "John",
    "age": 30,
    "city": "New York"
}
排序键输出
在序列化时,可以使用sort_keys参数将输出的JSON对象的键按字母顺序排序。
json_string = json.dumps(data, sort_keys=True, indent=4)
output
{
    "age": 30,
    "city": "New York",
    "name": "John"
}
忽略非ASCII字符的转义
默认情况下,json库会将非ASCII字符转义。可以通过设置ensure_ascii=False来保留原始字符
data = {'name': 'José'}
json_string = json.dumps(data, ensure_ascii=False)
output
{"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}')
output
JSON decode error: Expecting ',' delimiter: line 1 column 45 (char 44)
小结
- json库提供了强大的功能来处理JSON格式的数据。
- 常用API:dumps()、loads()、dump()和load()。
- 在处理复杂数据结构、自定义编码器和解码器时,json库表现得非常灵活。
- 使用技巧如美观输出、排序键输出和处理异常等,可以提升使用体验。
X 参考文献
- json:Python标准库,用于处理JSON数据。
- csv:Python标准库,用于读写CSV文件。
import json
import csv
//从JSON文件中加载数据
with open('data.json') as json_file:
    data = json.load(json_file)
//如果数据已经以字符串形式存在
data = json.loads(json_string)
//创建CSV文件并写入数据
with open('data.csv', 'w', newline='') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(data[0].keys())  # 写入CSV的表头
    for item in data:
        writer.writerow(item.values())  # 逐行写入数据
 
    
    本文作者:
        千千寰宇
    
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号