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.
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ộ 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:
- Định nghĩa lớp
WeatherDatavới các thuộc tính:location,temperature,humidityvàconditions. - 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.
- 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