Tôi muốn thêm một số kiểm tra các trường, e. g. để bạn có thể bắt lỗi như khi bạn nhận được json không hợp lệ hoặc không phải là json mà bạn mong đợi, vì vậy tôi đã sử dụng các bộ tên
from collections import namedtuple
payload = namedtuple['payload', ['action', 'method', 'data']]
def deserialize_payload[json]:
kwargs = dict[[[field, json[field]] for field in payload._fields]]
return payload[**kwargs]
điều này sẽ cung cấp cho bạn các lỗi tốt khi json bạn đang phân tích cú pháp không khớp với thứ bạn muốn nó phân tích cú pháp
>>> json = {"action":"print","method":"onData","data":"Madan Mohan"}
>>> deserialize_payload[json]
payload[action='print', method='onData', data='Madan Mohan']
>>> badjson = {"error":"404","info":"page not found"}
>>> deserialize_payload[badjson]
Traceback [most recent call last]:
File "", line 1, in
File "", line 2, in deserialize_payload
KeyError: 'action'
nếu bạn muốn phân tích các quan hệ lồng nhau, e. g. '{"parent":{"child":{"name":"henry"}}}'
bạn vẫn có thể sử dụng các bộ được đặt tên và thậm chí là một chức năng có thể tái sử dụng nhiều hơn
Và sử dụng json. phương thức kết xuất để chuyển đổi nó thành đối tượng sang định dạng json. Hiện tượng này được gọi là tuần tự hóa. Và trong khi chuyển đổi đối tượng vượt qua. __dict__ làm đầu vào tạo "Đối tượng thuộc loại Người có thể tuần tự hóa JSON". nếu không, chúng tôi sẽ gặp lỗi “Đối tượng thuộc loại Người không thể tuần tự hóa JSON”
Dưới đây là ảnh chụp đầu ra từ thiết bị đầu cuối, Trong ảnh chụp nhanh đầu ra, chúng ta có thể thấy đối tượng người mà chúng ta đã chuyển đổi thành văn bản i. e. ở định dạng json
Dưới đây là mã để chuyển đổi chuỗi Json thành đối tượng
- nhập json
- jsonString = '{"tên". "ABC", "tuổi". 20, "giới tính". "Nam", "là_sinh viên". "Thật"}'
- người. __dict__ = json. tải [jsonString]
- in[f"người. Tên. {người. Tên}"]
- in[f"người. tuổi. {người. tuổi}"]
- in[f"người. giới tính. {người. giới tính}"]
- in[f"người. is_student. {người. is_student}"]
Trong đoạn mã trên, chúng ta có thể thấy rằng, chúng ta đã sử dụng Json. tải để chuyển đổi chuỗi Json thành đối tượng từ điển và sau đó gán nó cho người. __dict__ để deserialize vào đối tượng Person
Dưới đây là ảnh chụp đầu ra từ thiết bị đầu cuối. Trong ảnh chụp nhanh đầu ra, chúng ta có thể thấy rằng từ đối tượng được giải tuần tự hóa, chúng ta có thể truy cập tên, tuổi, giới tính và Thuộc tính is_student
Từ blog này, chúng tôi đã hiểu về tuần tự hóa và giải tuần tự hóa. Chúng ta có thể tuần tự hóa đối tượng thành Json, XML, Yaml và ngược lại. Chúng ta sẽ thấy nhiều hơn về nó trong những ngày tới
Đây là bài viết tiếp theo để đóng vòng lặp về các vấn đề tuần tự hóa và giải tuần tự hóa trong Python. Tuần tự hóa đang biến một đối tượng thành các chuỗi hoặc tệp và để lấy lại các đối tượng ban đầu từ các chuỗi đã lưu là giải tuần tự hóa. Nếu bạn hiểu cách tuần tự hóa được thực hiện, bạn có thể đảo ngược quá trình giải tuần tự hóa khá nhiều. Tuy nhiên, như thường lệ, ma quỷ nằm trong chi tiết. Trước tiên hãy bắt đầu với định nghĩa của một lớp tùy chỉnh
1. Định nghĩa lớp tùy chỉnhĐể khớp hình minh họa với bài viết trước, trước tiên hãy sử dụng cùng một lớp Nhãn đơn giản
class Label:
def __init__[self, label, x, y, width, height]:
self.label = label
self.x = x
self.y = y
self.width = width
self.height = height
Chuỗi được tuần tự hóa bằng cách sử dụng json. bãi [] là
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
2. json. tải [] với object_hookPhương thức deserialization mặc định là json. loading[] lấy một chuỗi làm đầu vào và xuất ra một đối tượng từ điển JSON. Để chuyển đổi đối tượng từ điển thành đối tượng lớp tùy chỉnh, bạn cần viết phương thức giải tuần tự hóa. Cách dễ nhất là thêm một phương thức tĩnh vào chính lớp đó. Toàn bộ lớp với các phương thức serialize [to_json] và deserialize [from_json] sẽ trông như thế này
Được trang bị phương pháp khử lưu huỳnh, chúng ta có thể gọi json. loading và chỉ định phương thức deserialization mới của lớp Label là object_hook
Phương thức loading[], thay vì trả về một đối tượng từ điển JSON, sẽ trả về một đối tượng Nhãn thích hợp như mong đợi
3. đối tượng lồng nhauCàng xa càng tốt. Bây giờ hãy xem bạn cần làm gì đối với các trường hợp phức tạp hơn khi bạn có các đối tượng lồng nhau. Lớp ImageLabelCollection chứa danh sách các đối tượng Nhãn như một phần của biến lớp 'bboxes'. Định nghĩa của lớp được sao chép bên dưới với phương thức tuần tự hóa to_json[]
Một mẫu của chuỗi json kết quả là
Đối tượng ImageLabelCollection được tuần tự hóaĐể giải tuần tự hóa chuỗi thành một đối tượng lớp, bạn cần viết một phương thức tùy chỉnh để xây dựng đối tượng. Bạn có thể thêm một phương thức tĩnh vào ImageLabelCollection bên trong đó bạn xây dựng các đối tượng Nhãn từ từ điển JSON đã tải và sau đó gán chúng dưới dạng danh sách cho biến lớp bbox
Quá trình này hơi tẻ nhạt nhưng có một cách tốt hơn. Bạn có thể viết phương thức tĩnh from_json[] trong đó bạn xử lý việc xây dựng đối tượng lớp tăng dần
Khi json. loading[] được gọi với phương thức from_json[] ở trên làm hook đối tượng, nó sẽ gọi phương thức này lặp đi lặp lại khi nó xây dựng đối tượng từ dưới lên
Điều hấp dẫn là phương thức này được gọi nhiều lần và mỗi lần, một phần khác của đối tượng từ điển được gọi, do đó bạn phải thêm logic xử lý cách biến các đối tượng từ điển thành các đối tượng lớp phù hợp tùy thuộc vào loại. Trong trường hợp trên, tôi đã sử dụng sự hiện diện của một số khóa nhất định làm gợi ý để quyết định hàm tạo nào sẽ được gọi. Vẫn còn một chút tẻ nhạt, nhưng tốt hơn giải pháp ban đầu là tự viết toàn bộ mã
4. jsonpicklePhương pháp giải tuần tự hóa cuối cùng là sử dụng một thư viện bên ngoài có tên là jsonpickle. Bạn có thể dễ dàng cài đặt nó bằng cách
pip install jsonpickle
Cách sử dụng khá đơn giản. Bạn gọi jsonpickle. encode[] để tuần tự hóa và giải mã[] để giải tuần tự hóa
Kết quả tuần tự hóa hơi khác so với chuỗi JSON ban đầu của chúng tôi
{"py/object": "__main__.ImageLabelCollection", "version": 1, "type": "bounding-box-labels", "bboxes": {"20210715_111300 16.jpg": [{"py/object": "__main__.Label", "label": "StabilityOff", "x": 1, "y": 1025, "width": 553, "height": 29}, {"py/object": "__main__.Label", "label": "StabilityOn", "x": 1, "y": 964, "width": 563, "height": 30}]}}
Nó đã thêm một số thông tin chú thích bổ sung để giải tuần tự hóa sau
Phần kết luậnVới tính đơn giản của jsonpickle, có vẻ như đối với các mục đích chung, đây sẽ là phương pháp dễ dàng nhất để tuần tự hóa. Tuy nhiên, hạn chế là do thuộc tính bổ sung của jsonpickle trong chuỗi JSON, bạn cần sử dụng phương thức giải mã [] của jsonpickle để đưa các đối tượng trở lại. Nói chung, đây không phải là vấn đề, nhưng nếu bạn có một số đối tượng tùy chỉnh mà bạn cần tự xử lý, bạn có thể sử dụng phương pháp khử lưu huỳnh tùy chỉnh được đề xuất. Toàn bộ code mẫu được chia sẻ tại đây. Cảm ơn vì đã đọc