Python - JSON:Python 中 JSON 处理的初学者指南

大家好,未来的 Python 大师们!今天,我们将开始一段激动人心的旅程,深入了解 Python 中的 JSON。如果你是编程新手,也不用担心——我将作为你的友好向导,一步一步地讲解。在本教程结束时,你将能够像专业人士一样处理 JSON!

Python - 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