Python - JSON:Python 中 JSON 處理的初學者指南

你好啊,未來的 Python 大師們!今天,我們將開啟一段令人興奮的旅程,深入 Python 裡的 JSON 世界。如果你是編程新手,不用擔心——我將成為你的友好導遊,我們將一步步進行。在這篇教程結束時,你將能夠像專家一樣處理 JSON!

Python - JSON

Python 裡的 JSON

JSON 是什麼?

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。可以把它看作是一種存儲和傳輸數據的方式——就像一種不同的程序都能理解的通用語言。它易於人類閱讀(對我們來說太棒了!)並且機器容易解析和生成。

在編程世界裡,JSON就像那個大家都想一起出去玩儿的酷小孩。它到處都被使用——從網頁 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 中可能只是一小部分,但在當今的數據驅動世界裡,這是一項關鍵技能。無論你是構建網頁應用程序、與 API 一起工作還是分析數據,你新學到的 JSON 技能都將為你服務得很好。

繼續編碼,繼續學習,最重要的是,繼續享受 Python 的樂趣!

Credits: Image by storyset