Python - JSON



Python 中的 JSON

Python 中的 JSON 是一種流行的資料格式,用於系統之間的資料交換。json 模組提供了用於處理 JSON 資料的函式,允許您將 Python 物件序列化為 JSON 字串,並將 JSON 字串反序列化回 Python 物件。

JSON(JavaScript 物件表示法)是一種輕量級的資料交換格式,易於人類讀取和編寫,也易於機器解析和生成。它主要用於以文字形式在伺服器和 Web 應用程式之間傳輸資料。

JSON 序列化

JSON 序列化是將 Python 物件轉換為 JSON 格式的過程。這對於以易於傳輸或儲存的格式儲存資料非常有用,並且以後可以將其重建回其原始形式。

Python 提供了json 模組來處理 JSON 序列化和反序列化。我們可以使用此模組中的 json.dumps() 方法進行序列化。

您可以將以下 Python 物件型別序列化為 JSON 字串:

  • 字典
  • 列表
  • 元組
  • 字串
  • 整數
  • 浮點數
  • 布林值
  • None

示例

以下是如何將 Python 字典序列化為 JSON 字串的基本示例:

import json

# Python dictionary
data = {"name": "Alice", "age": 30, "city": "New York"}

# Serialize to JSON string
json_string = json.dumps(data)
print(json_string)

它將產生以下輸出:

{"name": "Alice", "age": 30, "city": "New York"}

JSON 反序列化

JSON 反序列化是將 JSON 字串轉換回 Python 物件的過程。這對於讀取和處理以 JSON 格式傳輸或儲存的資料至關重要。

在 Python 中,我們可以使用 json.loads() 方法從字串反序列化 JSON 資料,並使用 json.load() 方法從檔案反序列化 JSON 資料。

示例:將 JSON 字串反序列化為 Python 物件

在下面的示例中,我們使用 json.loads() 方法將 JSON 字串反序列化為 Python 字典:

import json

# JSON string
json_string = '{"name": "John", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": {"city": "New York", "state": "NY"}}'

# Deserialize JSON string to Python object
python_obj = json.loads(json_string)

print(python_obj)

以下是上述程式碼的輸出:

{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}

示例:從檔案反序列化 JSON

現在,要讀取並從檔案反序列化 JSON 資料,我們使用 json.load() 方法:

import json

# Read and deserialize from file
with open("data.json", "r") as f:
   python_obj = json.load(f)

print(python_obj)

上述程式碼的輸出如下:

{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}

高階 JSON 處理

如果您的 JSON 資料包含需要特殊處理的物件(例如,自定義類),您可以定義自定義反序列化函式。使用 json.loads() 或 json.load() 方法的object_hook 引數來指定一個函式,該函式將在解碼的每個 JSON 物件的結果上呼叫。

示例

在下面的示例中,我們演示了自定義物件序列化的用法:

import json
from datetime import datetime

# Custom deserialization function
def custom_deserializer(dct):
   if 'joined' in dct:
      dct['joined'] = datetime.fromisoformat(dct['joined'])
   return dct

# JSON string with datetime
json_string = '{"name": "John", "joined": "2021-05-17T10:15:00"}'

# Deserialize with custom function
python_obj = json.loads(json_string, object_hook=custom_deserializer)

print(python_obj)

我們得到如下所示的輸出:

{'name': 'John', 'joined': datetime.datetime(2021, 5, 17, 10, 15)}

JSONEncoder 類

Python 中的JSONEncoder 類用於將 Python 資料結構編碼為 JSON 格式。每個 Python 資料型別都轉換為其對應的 JSON 型別,如下表所示:

Python JSON
字典 物件
列表、元組 陣列
字串 字串
整數、浮點數、整數和浮點數派生的列舉 數字
True true
False false
None None

JSONEncoder 類使用JSONEncoder() 建構函式例項化。此類中定義了以下重要方法:

  • encode(obj) − 將 Python 物件序列化為 JSON 格式的字串。

  • iterencode(obj) − 編碼物件並返回一個迭代器,該迭代器會生成物件中每個專案的編碼形式。

  • indent − 確定編碼字串的縮排級別。

  • sort_keys − 如果為 True,則鍵按排序順序顯示。

  • check_circular − 如果為 True,則檢查容器型別物件中的迴圈引用。

示例

在以下示例中,我們正在編碼 Python 列表物件。我們使用 iterencode() 方法來顯示編碼字串的每個部分 −

import json

data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()

# Using iterencode() method 
for obj in e.iterencode(data):
   print(obj)

它將產生以下輸出:

["Rakesh"
, 
{
"marks"
: 
[50
, 60
, 70
]
}
]

JSONDecoder 類

JSONDecoder 類用於將 JSON 字串解碼回 Python 資料結構。此類中的主要方法是 decode()。

示例

在此示例中,“JSONEncoder”用於將 Python 列表編碼為 JSON 字串,然後“JSONDecoder”用於將 JSON 字串解碼回 Python 列表 −

import json

data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()
s = e.encode(data)
d = json.JSONDecoder()
obj = d.decode(s)
print(obj, type(obj))

獲得的結果如下所示 −

['Rakesh', {'marks': [50, 60, 70]}] <class 'list'>
廣告