Menu
CoddyTech

Giải mã JSON tùy chỉnh

Bài học 9 trên 9 trong khóa học JSON trong Python của Coddy.

Giải mã JSON tùy chỉnh là một tính năng nâng cao của mô-đun json trong Python, cho phép bạn kiểm soát cách chuyển đổi dữ liệu JSON thành các đối tượng Python. Tính năng này đặc biệt hữu ích khi làm việc với cấu trúc dữ liệu phức tạp hoặc khi bạn muốn tạo các đối tượng Python cụ thể từ dữ liệu JSON.

Lớp JSONDecoder

Để triển khai giải mã JSON tùy chỉnh, bạn cần tạo lớp con từ lớp json.JSONDecoder và ghi đè phương thức object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # Logic giải mã tùy chỉnh ở đây
        return dct

Sử dụng bộ giải mã tùy chỉnh

Sau khi định nghĩa bộ giải mã tùy chỉnh, bạn có thể dùng nó với json.loads() hoặc json.load():


decoded_object = json.loads(json_string, cls=CustomDecoder)

Ví dụ: Giải mã thành các đối tượng tùy chỉnh

Hãy xem một ví dụ thực tế về cách giải mã dữ liệu JSON thành các đối tượng Python tùy chỉnh:


import json
from datetime import datetime

class Person:
    def __init__(self, name, birthdate):
        self.name = name
        self.birthdate = birthdate

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        if 'name' in dct and 'birthdate' in dct:
            return Person(dct['name'], datetime.fromisoformat(dct['birthdate']))
        return dct

json_string = '{"name": "Alice", "birthdate": "1990-05-15"}'
person = json.loads(json_string, cls=CustomDecoder)

print(type(person))  # Đầu ra: <class '__main__.Person'>
print(person.name)   # Đầu ra: Alice
print(person.birthdate)  # Đầu ra: 1990-05-15 00:00:00

Điểm chính

  • Phương thức object_hook được gọi cho mỗi đối tượng đã giải mã.
  • Bạn có thể kiểm tra các khóa hoặc mẫu cụ thể để xác định cách giải mã đối tượng.
  • Trả về nguyên trạng đối tượng nếu không cần giải mã tùy chỉnh cho cấu trúc cụ thể đó.
  • Bộ giải mã tùy chỉnh hữu ích khi tạo trực tiếp các đối tượng chuyên biệt cho từng lĩnh vực từ dữ liệu JSON.

Bằng cách dùng bộ giải mã JSON tùy chỉnh, bạn có thể tích hợp liền mạch dữ liệu JSON vào mô hình đối tượng của ứng dụng Python, giúp quá trình giải tuần tự hóa dữ liệu linh hoạt hơn và phù hợp với nhu cầu cụ thể của bạ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ộ giải mã JSON tùy chỉnh cho hệ thống dữ liệu thời tiết. Bộ giải mã cần chuyển đổi các chuỗi JSON thành đối tượng WeatherData với những thuộc tính và phép chuyển đổi cụ thể. Hãy thực hiện các yêu cầu sau:

  1. Định nghĩa lớp WeatherData với các thuộc tính: location, temperature, humidity và conditions.
  2. Tạo một lớp con tùy chỉnh của JSONDecoder để:
    • Chuyển đổi nhiệt độ từ Fahrenheit sang Celsius và làm tròn đến một chữ số thập phân.
    • Đảm bảo độ ẩm được biểu thị dưới dạng phần trăm (ví dụ: 0.65 trở thành 65%).
    • Viết hoa chữ cái đầu của mỗi từ trong chuỗi conditions.
  3. Triển khai một hàm (function) nhận vào một chuỗi JSON, dùng bộ giải mã tùy chỉnh để phân tích chuỗi đó và trả về một chuỗi được định dạng có chứa dữ liệu thời tiết.

Đầu vào sau sẽ được cung cấp:


{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}

In chuỗi đã định dạng theo mẫu sau:

"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

Tự làm thử

Here's a suitable starter code for the challenge:

```python
import json

# Read input
json_string = input()

class WeatherData:
    def __init__(self, location, temperature, humidity, conditions):
        self.location = location
        self.temperature = temperature
        self.humidity = humidity
        self.conditions = conditions

class CustomJSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

    def object_hook(self, dct):
        # TODO: Implement the custom decoding logic here
        pass

def parse_weather_data(json_string):
    # TODO: Implement the parsing function here
    pass

# TODO: Use the CustomJSONDecoder and parse_weather_data function to process the input

# Placeholder for the result
result = "Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

# Output the result
print(result)
```

Tất cả bài học trong JSON trong Python

Tự luyện tập: Trình biên dịch Python online