Python怎么翻译JSON?从基础到实践的全面指南
在Python开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互、配置文件存储、API接口响应等场景,所谓“翻译JSON”,本质上是实现Python数据类型与JSON格式之间的相互转换——即将Python对象序列化为JSON字符串(编码),以及将JSON字符串反序列化为Python对象(解码),本文将详细介绍Python中处理JSON的核心方法、常见场景及注意事项,帮你彻底“翻译JSON”的技巧。
为什么需要“翻译JSON”?——JSON与Python的天然联系与差异
JSON是一种文本格式,其数据结构以键值对(对象)和有序列表(数组)为基础,与Python中的字典(dict)和列表(list)高度相似。
- JSON对象
{ "name": "Alice", "age": 25 }对应Python字典{"name": "Alice", "age": 25} - JSON数组
[1, 2, {"a": 3}]对应Python列表[1, 2, {"a": 3}]
这种相似性使得Python与JSON的“翻译”非常自然,但两者仍存在细微差异:
- JSON的键必须是字符串,且必须用双引号();Python字典的键可以是可哈希类型(如字符串、数字),且单引号、双引号均可。
- JSON中不支持Python的元组(tuple)、集合(set)、
None(对应JSON的null)等类型,需转换时注意。
核心工具:json模块——Python内置的“翻译官”
Python标准库提供了json模块,专门用于处理JSON数据的编码与解码,无需安装,直接通过import json即可使用,其核心功能包括4个方法:
| 方法 | 作用 | 方向 |
|---|---|---|
json.dumps() |
将Python对象转为JSON字符串 | 编码(序列化) |
json.dump() |
将Python对象写入文件,转为JSON格式 | 编码(文件写入) |
json.loads() |
将JSON字符串转为Python对象 | 解码(反序列化) |
json.load() |
从文件读取JSON,转为Python对象 | 解码(文件读取) |
编码:Python对象 → JSON字符串(json.dumps())
当需要将Python对象(如字典、列表)通过网络传输或存储为文本时,需用json.dumps()(dump string)将其转为JSON字符串。
基础用法:
import json
# Python字典
python_dict = {"name": "Bob", "age": 30, "hobbies": ["reading", "coding"]}
json_str = json.dumps(python_dict)
print(json_str) # 输出: {"name": "Bob", "age": 30, "hobbies": ["reading", "coding"]}
进阶参数:json.dumps()支持多个参数,灵活控制输出格式:
indent:指定缩进空格数,美化输出(适合调试或配置文件)。print(json.dumps(python_dict, indent=2)) # 输出(格式化后): # { # "name": "Bob", # "age": 30, # "hobbies": [ # "reading", # "coding" # ] # }ensure_ascii:默认为True,非ASCII字符(如中文)会转义为Unicode;设为False可保留原字符。python_dict_chinese = {"城市": "北京", "人口": 2154} print(json.dumps(python_dict_chinese, ensure_ascii=False)) # 输出: {"城市": "北京", "人口": 2154}sort_keys:对字典的键进行排序(默认False)。print(json.dumps({"b": 2, "a": 1}, sort_keys=True)) # 输出: {"a": 1, "b": 2}
编码:Python对象 → JSON文件(json.dump())
若需将Python对象直接保存为JSON文件(如配置文件、数据导出),使用json.dump()(dump file),它会将对象序列化后写入文件,无需手动拼接字符串。
用法示例:
import json
python_data = {
"users": [
{"id": 1, "name": "Alice", "active": True},
{"id": 2, "name": "Bob", "active": False}
],
"total": 2
}
# 写入JSON文件(使用utf-8编码,避免中文乱码)
with open("data.json", "w", encoding="utf-8") as f:
json.dump(python_data, f, indent=2, ensure_ascii=False)
data.json):
# {
# "users": [
# {
# "id": 1,
# "name": "Alice",
# "active": true
# },
# {
# "id": 2,
# "name": "Bob",
# "active": false
# }
# ],
# "total": 2
# }
解码:JSON字符串 → Python对象(json.loads())
当收到JSON格式的字符串数据(如API响应、用户输入)时,需用json.loads()(load string)将其转为Python对象(字典、列表等),方便后续处理。
基础用法:
import json
json_str = '{"name": "Charlie", "age": 28, "skills": ["Python", "SQL"]}'
python_obj = json.loads(json_str)
print(python_obj) # 输出: {'name': 'Charlie', 'age': 28, 'skills': ['Python', 'SQL']}
print(type(python_obj)) # 输出: <class 'dict'>
# 访问Python对象中的数据
print(python_obj["name"]) # 输出: Charlie
print(python_obj["skills"][0]) # 输出: Python
注意事项:
- JSON字符串必须用双引号包裹键和字符串值,单引号会导致
json.JSONDecodeError。# 错误示例(单引号) invalid_str = "{'name': 'Dave'}" # 会报错:json.decoder.JSONDecodeError # 正确写法(双引号) valid_str = '{"name": "Dave"}'
解码:JSON文件 → Python对象(json.load())
若需从JSON文件中读取数据(如读取配置文件、加载历史数据),使用json.load()(load file),它会直接读取文件内容并反序列化为Python对象。
用法示例:
假设data.json如下:
{
"api_url": "https://api.example.com",
"timeout": 5,
"retry": true
}
读取该文件:
import json
with open("data.json", "r", encoding="utf-8") as f:
config = json.load(f)
print(config) # 输出: {'api_url': 'https://api.example.com', 'timeout': 5, 'retry': True}
print(config["api_url"]) # 输出: https://api.example.com
进阶场景:处理复杂类型与自定义逻辑
Python的json模块默认支持基本类型(dict、list、str、int、float、bool、None),但遇到自定义类对象、datetime、集合等复杂类型时,直接序列化会报错(如TypeError: Object of type User is not JSON serializable),此时需通过“自定义序列化/反序列化逻辑”解决。
处理自定义类对象
假设有一个User类,需将其转为JSON:
import json
from datetime import datetime
class User:
def __init__(self, name, birth_date):
self.name = name
self.birth_date = birth_date # datetime类型
# 创建User对象
user = User("Eve", datetime(1995, 5, 10))
# 直接序列化会报错:TypeError: Object of type datetime is not JSON serializable
# json.dumps(user) # 取消注释会报错
解决方案:使用default参数指定序列化函数
def serialize_user(obj):
"""自定义序列化逻辑:将User对象转为字典"""
if isinstance(obj, User):
return {
"name": obj.name,
"birth_date": obj.birth_date.isoformat() # datetime转为字符串
}
raise TypeError(f"Object of type {type(obj)} is not JSON


还没有评论,来说两句吧...