python操作json文件的核心是使用内置json模块的load、dump、loads、dumps四个方法,1. 读取json文件用json.load()将json数据反序列化为python字典或列表,2. 写入json文件用json.dump()将python数据序列化为json格式并保存,3. 解析json字符串用json.loads()将其转换为python对象,4. 生成json字符串用json.dumps()将python对象序列化为json字符串,所有操作需注意编码设置encoding='utf-8'和ensure_ascii=false以支持中文,同时需处理json与python间的数据类型映射,如dict↔object、list↔array、none↔null,避免set、tuple、datetime等类型直接序列化的错误,可通过自定义jsonencoder或object_hook解决复杂类型转换问题,最终实现文件读写、api通信、配置管理、日志记录等场景下的可靠数据交换。
Python操作JSON文件,核心就是利用其内置的
json
json
Python处理JSON文件,主要围绕
json
load()
dump()
loads()
dumps()
1. 读取JSON文件(反序列化到Python对象)
立即学习“Python免费学习笔记(深入)”;
当你有一个
.json
json.load()
import json file_path = 'data.json' # 假设你有一个名为data.json的文件 # data.json内容示例: {"name": "张三", "age": 30, "isStudent": false, "courses": ["Math", "Physics"]} try: with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) print("成功读取文件,数据类型:", type(data)) print("读取到的数据:", data) print("姓名:", data.get('name')) except FileNotFoundError: print(f"错误:文件 '{file_path}' 不存在。") except json.JSONDecodeError as e: print(f"错误:JSON解析失败,文件 '{file_path}' 可能格式不正确。详细信息:{e}") except Exception as e: print(f"发生未知错误:{e}")
这里我习惯用
with open(...)
encoding='utf-8'
2. 写入JSON文件(序列化Python对象)
如果你有一些Python数据,想保存成JSON格式的文件,就用
json.dump()
import json my_data = { "name": "李四", "age": 25, "city": "北京", "interests": ["coding", "reading", "travel"], "is_active": True, "null_value": None } output_file_path = 'output.json' try: with open(output_file_path, 'w', encoding='utf-8') as f: # indent=4 让输出的JSON文件更易读,每个层级缩进4个空格 # ensure_ascii=False 确保非ASCII字符(如中文)直接写入,而不是转义成\uXXXX json.dump(my_data, f, indent=4, ensure_ascii=False) print(f"数据已成功写入到 '{output_file_path}'") except IOError as e: print(f"写入文件时发生IO错误:{e}") except Exception as e: print(f"发生未知错误:{e}")
indent
ensure_ascii=False
\uXXXX
3. 从JSON字符串解析(反序列化到Python对象)
有时候数据不是来自文件,而是通过网络请求(比如API接口返回)或者内存中的一个字符串,这时候就需要
json.loads()
import json json_string = '{"product": "Laptop", "price": 1200.50, "specs": {"cpu": "i7", "ram": "16GB"}}' try: product_info = json.loads(json_string) print("从字符串解析到的数据:", product_info) print("产品名称:", product_info['product']) except json.JSONDecodeError as e: print(f"错误:JSON字符串解析失败。详细信息:{e}")
4. 将Python对象转换为JSON字符串(序列化)
反过来,如果你想把Python数据转换成JSON格式的字符串,然后可能通过网络发送,或者存到数据库的某个文本字段里,就用
json.dumps()
import json python_object = { "event": "login", "user_id": 12345, "timestamp": "2023-10-27T10:30:00Z" } # 同样可以使用 indent 和 ensure_ascii 参数 json_output_string = json.dumps(python_object, indent=2, ensure_ascii=False) print("转换后的JSON字符串:") print(json_output_string)
这四个方法基本覆盖了日常JSON操作的绝大部分场景。掌握它们,你就掌握了Python处理JSON的核心能力。
这是个挺基础但又非常重要的问题,理解了它,你就能更好地预判数据转换后的形态,也能避免一些类型不匹配的坑。说白了,
json
JSON Object (对象) Python dict (字典):这是最常见的对应关系。JSON的对象是键值对的集合,键必须是字符串。Python的字典也是键值对集合,键可以是任何不可变类型,但序列化为JSON时,非字符串键会被转换为字符串。
{"name": "Alice", "age": 30}
{'name': 'Alice', 'age': 30}
JSON Array (数组) Python list (列表):JSON的数组是有序的值的集合。Python的列表也是有序的。
["apple", "banana", "cherry"]
['apple', 'banana', 'cherry']
JSON String (字符串) Python str (字符串):这个很简单,就是文本。
"Hello World"
'Hello World'
JSON Number (数字) Python int / float (整数 / 浮点数):JSON不区分整数和浮点数,统一为Number。Python会根据实际值转换成
int
float
123
123
3.14
3.14
JSON Boolean (布尔值) Python bool (布尔值):
true
true
false
false
true
true
false
false
JSON null (空值) Python None (空值):JSON的
null
None
null
None
需要注意的“陷阱”:
set
set
json.dumps()
TypeError
list
list(my_set)
tuple
list
list
tuple
("a", "b")
["a", "b"]
['a', 'b']
datetime
"2023-10-27T10:30:00Z"
datetime
json.dumps()
default
to_json
理解这些映射关系,能让你在处理数据时少走很多弯路。在我看来,尤其是
set
datetime
在实际开发中,操作JSON文件确实会遇到一些小麻烦,尤其是数据格式不规范的时候。我把我经常碰到的问题和一些调试经验分享给你。
1. json.JSONDecodeError: Expecting value:
json.JSONDecodeError: Extra data:
# 假设 file_path 导致了 JSONDecodeError try: with open(file_path, 'r', encoding='utf-8') as f: raw_content = f.read() print("--- 原始文件内容开始 ---") print(raw_content) print("--- 原始文件内容结束 ---") data = json.loads(raw_content) # 尝试用 loads 解析字符串 except Exception as e: print(f"解析错误:{e}")
2. TypeError: Object of type X is not JSON serializable
原因:当你尝试用
json.dump()
json.dumps()
set
datetime
调试技巧:
检查数据结构:仔细检查你要序列化的Python数据(字典或列表)中是否有非标准类型。
类型转换:在序列化前,手动将这些不兼容的类型转换为JSON可识别的类型。例如,
set
list
datetime
自定义序列化器:对于自定义类或复杂类型,可以为
json.dumps()
json.dump()
default
import datetime class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.isoformat() # 将 datetime 对象转换为 ISO 格式字符串 if isinstance(obj, set): return list(obj) # 将 set 转换为 list return json.JSONEncoder.default(self, obj) data_with_unserializable = { "name": "测试", "timestamp": datetime.datetime.now(), "tags": {"python", "json"} } # 使用自定义编码器 json_str = json.dumps(data_with_unserializable, cls=MyEncoder, indent=2, ensure_ascii=False) print(json_str)
这种方式非常灵活,能让你优雅地处理各种复杂数据类型。
3. FileNotFoundError
open()
print(file_path)
os.path.exists(file_path)
import os if not os.path.exists(file_path): print(f"错误:文件 '{file_path}' 不存在,请检查路径。") else: # 尝试打开文件 pass
4. 编码问题(乱码)
open()
encoding='utf-8'
ensure_ascii=False
json.dump()
json.dumps()
ensure_ascii=False
总的来说,处理JSON错误,核心就是“看报错信息,定位问题,然后用最直接的方式验证”。多用
try-except
JSON的魅力远不止文件读写那么简单,它已经成为现代Web开发和各种系统间数据交换的“通用语言”。在我看来,它的高级应用主要体现在以下几个方面:
1. API接口的数据载体
这是JSON最核心、也最普遍的应用场景。无论是前端(Web、移动App)与后端服务器通信,还是后端服务之间(微服务架构)的通信,JSON都是首选的数据格式。
2. 配置文件格式
很多应用程序、服务甚至前端项目的配置,都喜欢用JSON文件。
{ "database": { "host": "localhost", "port": 5432, "user": "admin", "password": "secure_password" }, "logging": { "level": "INFO", "file": "/var/log/app.log" }, "features": ["dark_mode", "notifications"] }
程序启动时加载这个JSON文件,就能获取所有配置信息。
3. 数据持久化与缓存
当需要将Python对象存储起来,但又不想用复杂的数据库,或者需要快速读写时,JSON是个不错的选择。
4. 日志记录与数据分析
将程序的运行日志、事件数据以JSON格式记录,方便后续的日志分析和数据挖掘。
{"timestamp": "2023-10-27T11:00:00Z", "level": "INFO", "message": "User logged in", "user_id": 123, "ip_address": "192.168.1.1"} {"timestamp": "2023-10-27T11:00:05Z", "level": "ERROR", "message": "Database connection failed", "error_code": 500}
5. 消息队列中的消息体
在RabbitMQ、Kafka等消息队列系统中,生产者发送的消息和消费者接收的消息,通常也是JSON格式的字符串。
6. 自定义序列化与反序列化
前面提到了
default
object_hook
default
datetime
Decimal
object_hook
# 假设有一个表示坐标的类 class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"Point(x={self.x}, y={self.y})" # 自定义 object_hook def as_point(dct): if 'x' in dct and 'y' in dct: return Point(dct['x'], dct['y']) return dct json_str_point = '{"x": 10, "y": 20}' point_obj = json.loads(json_str_point, object_hook=as_point) print(point_obj) # 输出: Point(x=10, y=20) print(type(point_obj)) # 输出: <class '__main__.Point'>
这种高级用法在处理复杂数据结构,或者需要将JSON数据映射到特定领域模型时非常有用。
总而言之,JSON的“高级”之处在于它作为一种简单而强大的数据交换格式,极大地简化了不同系统、不同语言之间的数据交互,是现代软件架构中不可或缺的一部分。
以上就是Python如何操作JSON文件?读写与解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号