Dictionary deserializer là một dự án được xây dựng để chuyển đổi từ điển thành các lớp tổng hợp theo cách trực quan. Đặc biệt chú ý đến việc thân thiện với trình kiểm tra kiểu tĩnh và tự động hoàn thành IDE
Dự kiến thư viện này được sử dụng cùng với trình giải tuần tự JSON-to-dict như
pip install dictionary-deserializer pip freeze > requirements.txt2
Cài đặt
Để sử dụng nó, chỉ cần thêm phần phụ thuộc
pip install dictionary-deserializer pip freeze > requirements.txt3 vào tệp yêu cầu của bạn
đường ống
pipenv install dictionary-deserializer
Pip
pip install dictionary-deserializer pip freeze > requirements.txt
Thiết kế
Dự án này ban đầu được coi là một bằng chứng về khái niệm, được sử dụng để tìm các dự án khác có thể thay thế dự án này, với bộ tính năng cần thiết. Dự án đó không được tìm thấy, và do đó, dự án này đã được mở rộng
Yêu cầu
- Sử dụng gợi ý loại để xác thực loại
- Cho phép đa hình
- Qua
pip install dictionary-deserializer pip freeze > requirements.txt
4s - Thông qua phân lớp
- Qua
- Hỗ trợ một phần lớn các loại mô-đun
pip install dictionary-deserializer pip freeze > requirements.txt
5 - Cho phép xác thực trên các giá trị
- Có thể xác thực và giải tuần tự hóa bất kỳ cấu trúc JSON tuân thủ nào
- Tương thích với trình kiểm tra kiểu tĩnh và gợi ý IDE
- Có tác động nhỏ đến mã hiện có khi bắt đầu sử dụng thư viện này
ví dụ
Không mã nào trong số này thực sự hữu ích nếu bạn không hiểu cách sử dụng nó. Nó rất đơn giản. Dưới đây là một số ví dụ
Chỉ định một cấu trúc
from typing import Optional from dict_deserializer.deserializer import Deserializable class User[Deserializable]: email: str # Type must be a string username: str # Type must be a string password: Optional[str] # Type must either be a string or a None
khử lưu huỳnh
from dict_deserializer.deserializer import deserialize, Rule # Successful deserialize[Rule[User], { 'email': 'pypi@rolfvankleef.nl', 'username': 'rkleef', }] # Fails because optional type is wrong deserialize[Rule[User], { 'email': 'pypi@rolfvankleef.nl', 'username': 'rkleef', 'password': 9.78, }]
cấu trúc đa hình
from typing import Optional, Any, List from dict_deserializer.deserializer import Deserializable from dict_deserializer.annotations import abstract @abstract class DirectoryObject[Deserializable]: name: str meta: Any class User[DirectoryObject]: full_name: str first_name: Optional[str] class Group[DirectoryObject]: members: List[DirectoryObject]
Nếu bạn deserialize thành
pip install dictionary-deserializer pip freeze > requirements.txt0, lớp phù hợp sẽ tự động được chọn. Nếu không có lớp con nào phù hợp, sẽ xảy ra lỗi do DirectoryObject được khai báo là trừu tượng
Nếu bạn muốn phân biệt không phải theo tên hoặc loại trường mà theo giá trị của chúng, người ta có thể chọn xác định chú thích
pip install dictionary-deserializer pip freeze > requirements.txt1
Xác thực giá trị
Cú pháp xác thực giá trị của khóa hiện tại hơi lạ. Nó không tương thích với cú pháp hiện có cho các giá trị mặc định, nhưng cú pháp kiểu thì giống nhau
Thí dụ
from typing import Optional from dict_deserializer.deserializer import Deserializable from dict_deserializer.annotations import validated class Test[Deserializable]: name: Optional[str] @validated[default='Unknown'] def name[self, value]: if len[value] > 20: raise TypeError['Name may not be longer than 20 characters.']
Hạn chế
Thư viện này sử dụng rộng rãi mô-đun
pip install dictionary-deserializer pip freeze > requirements.txt5. Tuy nhiên, nó chỉ hỗ trợ một số loại của nó. Đây là danh sách các loại hỗn hợp đã được xác minh
Chúng tôi sẽ xem xét các hạn chế của chúng, lỗi thời gian chạy, v.v. , với mã mẫu. Chúng tôi bắt đầu từ một loại từ điển cơ bản và cuối cùng thảo luận về một giải pháp để làm việc với các đối tượng Python phức tạp
Từ điểnPython và mô-đun json đang hoạt động rất tốt với từ điển. Phần sau đây dành cho tuần tự hóa và giải tuần tự hóa Python…
Đây là bài viết tiếp theo về Cách tuần tự hóa một đối tượng lớp thành JSON trong Python để đó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
________số 8Chuỗ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 dictionary-deserializer pip freeze > requirements.txt0
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
pip install dictionary-deserializer pip freeze > requirements.txt1
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