Menu
CoddyTech

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.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

challenge icon

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.

  1. Định nghĩa lớp ComplexNumber có các thuộc tính real và imag.
  2. Tạo một lớp con tùy chỉnh của JSONEncoder để xử lý các đối tượng ComplexNumber.
  3. Triển khai một hàm nhận danh sách các đối tượng ComplexNumber và 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