Mã hóa JSON tùy chỉnh
Bài học 6 trên 9 trong khóa học JSON trong Python của Coddy.
Mã hóa JSON tùy chỉnh là một tính năng mạnh mẽ trong module json của Python, cho phép bạn tuần tự hóa các đối tượng Python phức tạp mà JSON không hỗ trợ sẵn. Tính năng này đặc biệt hữu ích khi bạn làm việc với các lớp hoặc đối tượng tùy chỉnh không có biểu diễn JSON trực tiếp.
Lớp JSONEncoder
Để tạo một bộ mã hóa JSON tùy chỉnh, bạn cần tạo lớp con từ lớp json.JSONEncoder và ghi đè phương thức default() của lớp đó:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # Chuyển đối tượng của bạn thành từ điển
return json.JSONEncoder.default(self, obj)
Sử dụng bộ mã hóa tùy chỉnh
Sau khi định nghĩa bộ mã hóa tùy chỉnh, bạn có thể dùng nó với json.dumps() hoặc json.dump():
json_string = json.dumps(your_object, cls=CustomEncoder)
Ví dụ: mã hóa một lớp tùy chỉnh
Cùng xem một ví dụ thực tế:
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
Ví dụ này minh họa cách mã hóa lớp tùy chỉnh Person và xử lý đối tượng datetime bên trong lớp đó.
Điểm chính
- Phương thức
default()được gọi cho các đối tượng không thể tuần tự hóa bằng cách tích hợp sẵn. - Luôn cung cấp cách quay về bộ mã hóa mặc định khi gặp các kiểu dữ liệu không xác định.
- Bộ mã hóa tùy chỉnh hữu ích khi xử lý các cấu trúc dữ liệu phức tạp, lớp tùy chỉnh và kiểu dữ liệu Python không tiêu chuẩn.
Bằng cách dùng bộ mã hóa JSON tùy chỉnh, bạn có thể tích hợp liền mạch các đối tượng Python phức tạp vào quy trình làm việc với JSON, giúp việc tuần tự hóa dữ liệu linh hoạt và mạnh mẽ hơn.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Thử thách
DễTạo một bộ mã hóa JSON tùy chỉnh cho lớp ComplexNumber. Bộ mã hóa sẽ chuyển các số phức thành đối tượng JSON có các khóa 'real' và 'imag', lần lượt tương ứng với phần thực và phần ảo.
- Định nghĩa lớp
ComplexNumbercó các thuộc tínhrealvàimag. - Tạo một lớp con tùy chỉnh của
JSONEncoderđể xử lý các đối tượngComplexNumber. - Triển khai một hàm nhận danh sách các đối tượng
ComplexNumbervà trả về chuỗi JSON bằng bộ mã hóa tùy chỉnh.
Đầu vào sẽ là:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
Mỗi dòng biểu thị một số phức có phần thực và phần ảo, được phân tách bằng dấu phẩy.
In ra chuỗi JSON thu được. Định dạng JSON bằng cách thụt lề 2 dấu cách.
Tự làm thử
import json
# Đọc đầu vào
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: Tạo lớp con tùy chỉnh của JSONEncoder để xử lý các đối tượng ComplexNumber
# TODO: Viết hàm nhận danh sách đối tượng ComplexNumber và trả về chuỗi JSON
# TODO: Chuyển dữ liệu đầu vào thành các đối tượng ComplexNumber và dùng hàm vừa viết để tạo chuỗi JSON
# In ra chuỗi JSON thu được
print(json_string)Tất cả bài học trong JSON trong Python
Tự luyện tập: Trình biên dịch Python online