Python - JSON:Python 中 JSON 处理的初学者指南
大家好,未来的 Python 大师们!今天,我们将开始一段激动人心的旅程,深入了解 Python 中的 JSON。如果你是编程新手,也不用担心——我将作为你的友好向导,一步一步地讲解。在本教程结束时,你将能够像专业人士一样处理 JSON!
Python 中的 JSON
JSON 是什么?
JSON,即 JavaScript 对象表示法,是一种轻量级的数据交换格式。可以把它看作是一种存储和传输数据的方式——就像是一种不同的程序都能理解的通用语言。它既易于人类阅读(这对我们来说太好了!),也易于机器解析和生成。
在编程世界里,JSON 就像那个大家都想与之共度时光的酷小孩。它无处不在——从 Web API 到配置文件都在使用。这就是为什么学习在 Python 中使用 JSON 是一项如此重要的技能!
为什么在 Python 中使用 JSON?
Python 和 JSON 就像花生酱和果冻——它们在一起非常搭!Python 通过其 json
模块内置了对 JSON 的支持。这意味着你可以轻松地将 Python 对象转换为 JSON,反之亦然。
首先,我们导入 JSON 模块:
import json
很简单,对吧?现在我们准备深入到有趣的内容!
JSON 序列化
序列化就是将 Python 对象转换为 JSON 字符串的过程,这听起来很高大上,但其实很简单。就像是把 Python 翻译成其他程序能够理解的语言。
基本序列化
从一个简单的 Python 字典开始:
my_dict = {
"name": "Alice",
"age": 30,
"city": "Wonderland"
}
json_string = json.dumps(my_dict)
print(json_string)
输出:
{"name": "Alice", "age": 30, "city": "Wonderland"}
这里,json.dumps()
将我们的 Python 字典转换成了一个 JSON 字符串。这就像是魔法,但比魔法更好,因为这是真实的代码!
美观打印
有时,我们希望 JSON 看起来既美观又可读。这时就需要用到美观打印:
pretty_json = json.dumps(my_dict, indent=4)
print(pretty_json)
输出:
{
"name": "Alice",
"age": 30,
"city": "Wonderland"
}
indent=4
参数告诉 Python 添加 4 个空格的缩进,使我们的 JSON 看起来整洁有序。
将 JSON 写入文件
通常,我们希望将 JSON 数据保存到文件中。以下是操作方法:
with open('data.json', 'w') as file:
json.dump(my_dict, file, indent=4)
这会创建一个名为 data.json
的文件,并将我们美观打印的 JSON 写入其中。这就像是保存一条短信,但保存的是数据!
JSON 反序列化
反序列化是相反的过程——将 JSON 字符串转换回 Python 对象。就像是把通用语言翻译回 Python。
基本反序列化
从一个 JSON 字符串开始:
json_string = '{"name": "Bob", "age": 25, "city": "Neverland"}'
python_dict = json.loads(json_string)
print(python_dict)
print(type(python_dict))
输出:
{'name': 'Bob', 'age': 25, 'city': 'Neverland'}
<class 'dict'>
json.loads()
将我们的 JSON 字符串转换回 Python 字典。就像是魔法反过来施展!
从文件中读取 JSON
还记得我们之前创建的文件吗?让我们把它读回来:
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
这将从我们的文件中读取 JSON 数据,并将其转换回 Python 对象。就像是打开一条保存的短信并阅读它!
高级 JSON 处理
现在我们已经了解了基础知识,让我们来看看一些更高级的技术。
处理复杂数据类型
JSON 很棒,但它只原生支持几种数据类型。以下是 Python 类型到 JSON 类型的映射表:
Python 类型 | JSON 类型 |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
但是,对于像 datetime 对象这样的更复杂类型呢?这时就需要自定义编码了!
JSONEncoder 类
JSONEncoder
类允许我们为 Python 对象定义自定义编码,这些对象不是 JSON 原生支持的。
以下是一个使用 datetime 对象的示例:
from datetime import datetime
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Charlie",
"birthday": datetime(1990, 5, 15)
}
json_string = json.dumps(data, cls=DateTimeEncoder)
print(json_string)
输出:
{"name": "Charlie", "birthday": "1990-05-15T00:00:00"}
我们的自定义编码器将 datetime 对象转换为 ISO 格式字符串,JSON 可以处理。
JSONDecoder 类
同样,JSONDecoder
类允许我们自定义 JSON 如何解码回 Python 对象。
以下是一个将 ISO 格式字符串转换回 datetime 对象的示例:
import dateutil.parser
class DateTimeDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)
def object_hook(self, obj):
for key, value in obj.items():
if isinstance(value, str):
try:
obj[key] = dateutil.parser.parse(value)
except ValueError:
pass
return obj
json_string = '{"name": "Charlie", "birthday": "1990-05-15T00:00:00"}'
decoded_data = json.loads(json_string, cls=DateTimeDecoder)
print(decoded_data)
print(type(decoded_data['birthday']))
输出:
{'name': 'Charlie', 'birthday': datetime.datetime(1990, 5, 15, 0, 0)}
<class 'datetime.datetime'>
我们的自定义解码器识别 ISO 格式字符串并将其转换回 datetime 对象。
就是这些了,各位!我们已经深入了解了 Python 中的 JSON,从序列化和反序列化的基础知识到自定义编码和解码的高级内容。记住,熟能生巧,所以不要害怕尝试这些概念。
JSON 可能看起来只是 Python 的一个小部分,但在今天的数据驱动世界中,这是一项至关重要的技能。无论你是构建 Web 应用程序、使用 API 还是分析数据,你新掌握的 JSON 技能都将为你服务。
继续编码,继续学习,最重要的是,继续享受 Python 带来的乐趣!
Credits: Image by storyset