2.1 Module json
JSON (JavaScript Object Notation) — là một định dạng trao đổi dữ liệu nhẹ, dễ đọc và viết đối với con người, và cũng dễ phân tích và sinh dữ liệu đối với máy tính. JSON thường được sử dụng để truyền dữ liệu giữa máy chủ và ứng dụng web, cũng như để lưu trữ cấu hình và cài đặt.
Module json
trong Python cung cấp các chức năng để thực hiện
serialization (chuyển đổi các đối tượng Python thành chuỗi JSON) và deserialization
(chuyển đổi các chuỗi JSON thành đối tượng Python). Module này có sẵn trong
thư viện chuẩn của Python và được sử dụng rộng rãi để làm việc với
dữ liệu JSON.
Các chức năng chính của module json
rất giống với
pickle
và hoạt động tương tự. Tiêu chuẩn mà!
-
Làm việc với chuỗi:
-
json.dumps(obj)
— Chuyển đổi đối tượng Python thành chuỗi JSON. -
json.loads(s)
— Chuyển đổi chuỗi JSON thành đối tượng Python.
-
-
Làm việc với tệp:
-
json.dump(obj, file)
— Thực hiện serialization đối tượng Python và ghi nó vào tệp văn bản. -
json.load(file)
— Thực hiện deserialization đối tượng Python từ tệp văn bản chứa dữ liệu ở định dạng JSON.
-
Hãy cùng xem một vài ví dụ để ghi nhớ cách hoạt động của các chức năng này.
2.2 Serialization thành chuỗi
Serialization đối tượng Python thành chuỗi JSON
Để thực hiện serialization một đối tượng thành chuỗi, chỉ cần truyền nó vào hàm
json.dumps()
.
import json
# Ví dụ đối tượng để thực hiện serialization
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Chuyển đổi đối tượng Python thành chuỗi JSON
json_string = json.dumps(data, indent=4)
print("Dữ liệu đã được serialize (JSON):", json_string)
Deserialization các chuỗi JSON thành đối tượng Python
Để lấy đối tượng từ chuỗi, chỉ cần truyền chuỗi JSON
chứa mô tả đối tượng vào phương thức json.loads()
.
import json
# Ví dụ chuỗi JSON để thực hiện deserialization
json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
'''
# Chuyển đổi chuỗi JSON thành đối tượng Python
data = json.loads(json_string)
print("Dữ liệu đã được deserialize (Python):", data)
2.3 Serialization vào tệp
Ghi đối tượng Python vào tệp ở định dạng JSON
Để ghi đối tượng vào tệp, hãy gọi phương thức
json.dump()
. Khi làm việc với tệp, rất quan trọng để sử dụng xử lý ngoại lệ,
nhằm xử lý một cách chính xác các lỗi có thể xảy ra. Đây là một ví dụ:
import json
# Ví dụ đối tượng để thực hiện serialization
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Ghi đối tượng Python vào tệp JSON với xử lý ngoại lệ
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Dữ liệu đã được ghi vào tệp thành công.")
except IOError:
print("Lỗi khi ghi vào tệp.")
except json.JSONEncodeError:
print("Lỗi khi mã hóa JSON.")
Đọc đối tượng Python từ tệp ở định dạng JSON
Đọc cũng rất đơn giản — chỉ cần truyền tệp vào phương thức
json.load()
. Ở đây cũng cần sử dụng xử lý ngoại lệ:
import json
# Đọc đối tượng Python từ tệp JSON với xử lý ngoại lệ
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Dữ liệu đã được deserialize từ tệp (Python):", data)
except IOError:
print("Lỗi khi đọc tệp.")
except json.JSONDecodeError:
print("Lỗi khi giải mã JSON.")
2.4 Tham số bổ sung của các hàm
Trong hàm thực hiện serialization, có thể truyền các tham số bổ sung để làm cho JSON của bạn đẹp mắt hơn:
-
skipkeys
: NếuTrue
, nó sẽ bỏ qua các khóa không phải là chuỗi, số hoặcNone
. -
ensure_ascii
: NếuTrue
, tất cả các ký tự không phải ASCII sẽ được thoát dưới dạng Unicode escape sequences. -
indent
: Nếu chỉ định số, thụt đầu dòng sẽ được thêm để dễ đọc hơn. -
sort_keys
: NếuTrue
, các khóa trong JSON sẽ được sắp xếp theo thứ tự bảng chữ cái.
Ví dụ sử dụng các tham số trong json.dumps()
:
import json
data = {"c": 3, "b": 2, "a": 1}
# Serialization với sắp xếp khóa và thụt đầu dòng
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Bộ giải mã và mã hóa tùy chỉnh
Module json
cho phép sử dụng các hàm tùy chỉnh
để thực hiện serialization và deserialization các đối tượng.
Ví dụ về bộ mã hóa tùy chỉnh
Đầu tiên, chúng ta tạo một lớp mã hóa đặc biệt, bên trong kiểm tra rằng
nếu kiểu đối tượng == datetime, thì trả về đối tượng dưới dạng chuỗi
định dạng ISO
.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Serialization với bộ mã hóa tùy chỉnh
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Ví dụ về bộ giải mã tùy chỉnh
Đối với thao tác ngược lại, chúng ta cũng cần một hàm, cái mà chuyển đổi chuỗi
thành ngày tháng. Ví dụ, chúng ta có thể chỉ cần
kiểm tra tên trường, và nếu nó được gọi là timestamp, thì chuyển đổi
chuỗi thành đối tượng datetime
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct:
dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Deserialization với bộ giải mã tùy chỉnh
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION