Python JSON数据转换全攻略:从入门到精通
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易于阅读和编写,以及易于机器解析和生成,在当今的软件开发中得到了广泛应用,Python作为一门功能强大且简洁的编程语言,提供了内置的json模块,使得处理JSON数据变得异常轻松,本文将详细介绍如何使用Python进行JSON数据的转换,包括将Python对象转换为JSON字符串(序列化),以及将JSON字符串转换为Python对象(反序列化),并探讨一些常见的高级用法和注意事项。
JSON与Python数据的对应关系
在开始转换之前,了解JSON数据类型与Python数据类型之间的对应关系至关重要:
| JSON 类型 | Python 类型 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
理解了这种对应关系,我们就能更好地预判转换后的数据形态。
将Python对象转换为JSON字符串(序列化)
序列化是指将Python对象(如字典、列表)转换为JSON格式字符串的过程,这主要通过json.dumps()函数(dump string)实现。
基本序列化
import json
# Python字典
python_dict = {
"name": "张三",
"age": 30,
"is_student": False,
"courses": ["数学", "英语", "物理"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
# 将Python字典转换为JSON字符串
json_str = json.dumps(python_dict)
print("Python字典:")
print(python_dict)
print("\n转换后的JSON字符串:")
print(json_str)
print("\nJSON字符串类型:", type(json_str))
输出结果:
Python字典:
{'name': '张三', 'age': 30, 'is_student': False, 'courses': ['数学', '英语', '物理'], 'address': {'city': '北京', 'district': '海淀区'}}
转换后的JSON字符串:
{"name": "张三", "age": 30, "is_student": false, "courses": ["数学", "英语", "物理"], "address": {"city": "北京", "district": "海淀区"}}
JSON字符串类型: <class 'str'>
格式化输出(美化JSON)
默认情况下,json.dumps()输出的JSON字符串是紧凑的,如果我们希望输出更易读的格式(例如缩进),可以使用indent参数:
# 美化JSON输出
pretty_json_str = json.dumps(python_dict, indent=4, ensure_ascii=False)
print("\n美化后的JSON字符串:")
print(pretty_json_str)
输出结果:
美化后的JSON字符串:
{
"name": "张三",
"age": 30,
"is_student": false,
"courses": [
"数学",
"英语",
"物理"
],
"address": {
"city": "北京",
"district": "海淀区"
}
}
indent=4:指定缩进为4个空格。ensure_ascii=False:确保非ASCII字符(如中文)能原样输出,而不是被转义。
处理自定义对象
默认情况下,json.dumps()无法直接处理Python的自定义类对象实例,如果需要序列化自定义对象,可以通过自定义default参数来实现,该参数接受一个函数,该函数知道如何将对象转换为可序列化的类型。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
person = Person("李四", 25)
def person_serializer(obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 使用default参数
json_person = json.dumps(person, default=person_serializer, indent=4, ensure_ascii=False)
print("\n自定义对象序列化结果:")
print(json_person)
输出结果:
自定义对象序列化结果:
{
"name": "李四",
"age": 25
}
将JSON字符串转换为Python对象(反序列化)
反序列化是指将JSON格式字符串转换为Python对象(如字典、列表)的过程,这主要通过json.loads()函数(load string)实现。
基本反序列化
import json
# JSON字符串
json_string = '''
{
"name": "王五",
"age": 28,
"is_employee": true,
"skills": ["Python", "Java", "C++"],
"contact": {
"email": "wangwu@example.com",
"phone": "13800138000"
}
}
'''
# 将JSON字符串转换为Python字典
python_obj = json.loads(json_string)
print("JSON字符串:")
print(json_string)
print("\n转换后的Python对象:")
print(python_obj)
print("\nPython对象类型:", type(python_obj))
print("Python对象中的name:", python_obj["name"])
print("Python对象中的skills:", python_obj["skills"])
输出结果:
JSON字符串:
{
"name": "王五",
"age": 28,
"is_employee": true,
"skills": ["Python", "Java", "C++"],
"contact": {
"email": "wangwu@example.com",
"phone": "13800138000"
}
}
转换后的Python对象:
{'name': '王五', 'age': 28, 'is_employee': True, 'skills': ['Python', 'Java', 'C++'], 'contact': {'email': 'wangwu@example.com', 'phone': '13800138000'}}
Python对象类型: <class 'dict'>
Python对象中的name: 王五
Python对象中的skills: ['Python', 'Java', 'C++']
从文件读取JSON并反序列化
在实际应用中,JSON数据常常存储在文件中,我们可以使用json.load()函数(注意没有s)直接从文件对象读取并反序列化。
假设有一个名为data.json的文件,内容如下:
{
"status": "success",
"data": {
"id": 123,
"description": "这是一个示例数据"
}
}
Python代码:
import json
try:
with open('data.json', 'r', encoding='utf-8') as f:
data_from_file = json.load(f)
print("\n从文件读取的JSON数据:")
print(data_from_file)
print("数据类型:", type(data_from_file))
except FileNotFoundError:
print("\n错误:未找到data.json文件")
输出结果(假设文件存在):
从文件读取的JSON数据:
{'status': 'success', 'data': {'id': 123, 'description': '这是一个示例数据'}}
数据类型: <class 'dict'>
常见错误及处理
在进行JSON转换时,可能会遇到一些常见错误:
-
json.JSONDecodeError:当尝试用json.loads()解析一个不符合JSON格式的字符串时,会抛出此错误。invalid_json_str = "{'name': '赵六', 'age': 40}" # 注意是单引号,不符合JSON标准 try: json.loads(invalid_json_str) except json.JSONDecodeError as e: print(f"\nJSON解析错误: {e}") -
TypeError: Object of type XXX is not JSON serializable:当尝试序列化一个json.dumps()默认不支持的Python对象类型(如自定义类实例、日期时间对象等)时,会抛出此错误,解决方法是为自定义对象提供default处理器,或先将对象转换为支持的类型。
高级用法与技巧
-
处理日期时间对象: 日期时间对象(
datetime.datetime,datetime.date)默认不能直接序列化,可以自定义转换器:from datetime import datetime, date def datetime_serializer(obj): if isinstance(obj, (datetime, date)): return obj.isoformat() raise TypeError(f"Object of type {type(obj)} is not JSON serializable") now = datetime.now() data_with_datetime = {"current_time": now, "message": "当前时间"} json_with_datetime = json.dumps(data_with_datetime, default=datetime_serializer, ensure_ascii=False) print("\n包含日期时间的JSON:") print(json_with_datetime) -
处理中文编码: 如前所述,使用
ensure_ascii=False可以确保中文字符不被转义为\uXXXX的形式



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