Python JSON để phản đối
Đâ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 Show
Để 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: 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 Nếu bạn chuẩn bị đọc bài viết này, có lẽ bạn đã gặp một tình huống cần lưu trữ dữ liệu của mình ở định dạng có cấu trúc để có thể dễ dàng vận chuyển giữa các ứng dụng web và máy chủ JSON là viết tắt của Java Script Object Notation như đã nói ở trên là một định dạng dữ liệu thực sự rất nhẹ và khá giống với các đối tượng Từ điển Python. Chúng thực sự rất hữu ích vì các ứng dụng web và API có thể dễ dàng phân tích cú pháp thông qua chúng và nhanh chóng truyền dữ liệu giữa các ứng dụng và dịch vụ. Trong bài viết này, chúng tôi sẽ sử dụng gói python “json” để chuyển đổi đối tượng python thành đối tượng JSON. Trước khi đi sâu vào blog, hãy làm rõ những điều cơ bản về python; Cú pháp của đối tượng JSON
Gói cài đặtĐiều đầu tiên chúng ta cần làm là cài đặt gói “json” trong python. Gói “json” cho phép chúng ta chuyển đối tượng python thành đối tượng JSON. Sau đây là cú pháp cài đặt gói “json” trong môi trường python
Xin lưu ý rằng phương pháp chuyển đổi các đối tượng python thành JSON được gọi là tuần tự hóa. Đó là bởi vì khi chúng ta chuyển đổi một đối tượng python thành JSON (và ngược lại), đó là một quá trình lưu trữ dữ liệu thành một chuỗi byte Có bốn phương thức khác nhau trong mô-đun python json để hoạt động hoàn toàn với các đối tượng python và JSON. Bốn cái đó được đề cập như dưới đây
Khi máy tính của bạn đang xử lý nhiều thông tin thuộc nhiều loại dữ liệu khác nhau, nó cần một kết xuất dữ liệu để xử lý thông tin đó. Do đó, chúng ta có các phương thức dump() và dump() trong python. (Cũng đọc. Kiểu dữ liệu trong Python) Sau đây là bảng chuyển đổi đối tượng python thành đối tượng JSON tương đương. Nó khá thẳng về phía trước, nhưng cần phải được hiển thị Đối tượng Python Đối tượng JSON tương đương Chuỗi (str) chuỗi Số nguyên (int) Số - int Số dấu phẩy động (float) Số - thực Boolean Đúng (True) ĐÚNG VẬY Boolean Sai (Sai) sai danh sách mảng tuple mảng từ điển mục tiêu Không có Vô giá trị Bây giờ, chúng ta sẽ chuyển sang một số ví dụ trong đó chúng ta sử dụng các phương thức được đề cập ở trên để chuyển đổi một đối tượng python thành một đối tượng JSON tương đương và ngược lại (Phải bắt. Python để đại diện cho đầu ra) ví dụ 1. JSON. bãi ()json. Phương thức dumps() cho phép chúng ta chuyển đổi một đối tượng python thành một đối tượng chuỗi JSON tương đương. Điều này thực sự hữu ích khi cung cấp thông tin cho các API cần được phân tích cú pháp hoặc in. Xem một ví dụ dưới đây
Ở đây, chúng tôi đã tạo một từ điển python và sử dụng json. dumps() để chuyển đổi nó thành một đối tượng chuỗi JSON Xem đầu ra như hình dưới đây Đầu ra của chuyển đổi python sang JSON Chúng ta cũng có thể sử dụng các chức năng khác để sửa đổi mã sao cho nó có thể được sắp xếp tăng dần và thụt vào
Xem ngay đầu ra được cập nhật như hình bên dưới Đối tượng Python theo thứ tự JSON và có thụt đầu dòng Tại đây, bạn có thể thấy cách đầu ra được sắp xếp theo thứ tự tăng dần trong đó khóa “Tuổi” và giá trị tương đương xuất hiện trước thay vì khóa “Tên” và giá trị được liên kết với nó. Điều này là do chúng tôi đã sử dụng đối số sort_keys = True cho phép chúng tôi sắp xếp kết quả theo thứ tự tăng dần. Ngoài ra, bạn cũng có thể thấy đầu ra hiện được thụt vào mỗi dòng như thế nào vì chúng ta đã sử dụng đối số indent = 3 trong mã Ngoài ra, ngoài tất cả những điều này, làm cách nào chúng tôi có thể đảm bảo rằng việc chuyển đổi (đối tượng python thành chuỗi JSON) đã thực sự xảy ra? . Xem đoạn mã dưới đây để nhận thức rõ hơn ________số 8Bây giờ, nếu bạn thấy đầu ra, nó sẽ giống như hình bên dưới Kiểm tra lớp của đối tượng JSON Bạn có thể dễ dàng thấy rằng toàn bộ đối tượng my_details vốn là từ điển python trước đây giờ đã được chuyển đổi thành đối tượng JSON với kiểu class string. (Đọc thêm. Word nhúng trong NLP bằng Python) ví dụ 2. JSON. bãi rác()Ngoài json. bãi (), json. Phương thức dump() cho phép chúng ta chuyển đổi đối tượng python đã cho thành một đối tượng JSON tương đương và sau đó lưu kết quả vào một tệp văn bản. Chúng ta sẽ sử dụng cùng một ví dụ như trên cho ví dụ này
Ở đây, chúng ta đã sử dụng thao tác nhập xuất tệp để tạo một tệp JSON mới với tên “Data_File. json”. File này sẽ dùng để lưu trữ một từ điển python có tên my_details dưới dạng một chuỗi JSON, khi chúng ta nhấn vào json. phương thức đổ (). Ngoài ra, không có gì chúng tôi có thể hiển thị cho bạn dưới dạng đầu ra trong bảng điều khiển python. Tuy nhiên, trên thư mục làm việc của python, bạn có thể thấy một tệp json có tên Data_File. Xem ảnh chụp màn hình bên dưới Data_File được tạo trên thư mục python đang hoạt động Nếu bạn mở tệp JSON vào bất kỳ trình soạn thảo văn bản nào, bạn sẽ thấy một chuỗi JSON có dữ liệu tương đương với my_details bên dưới nó như hình bên dưới Đầu ra của Data_File trông như thế này (Blog được đề xuất. Python Essentials để điều khiển bằng giọng nói. Phần 1) Giải mã dữ liệu JSON thành đối tượng PythonĐể chuyển đổi (giải mã) các chuỗi JSON thành các đối tượng python tương đương, chúng ta có json. tải () và jso. load(), mà chúng tôi đã mô tả trước đó ở phần đầu của bài viết này. Giải mã nhìn như dưới đây Đối tượng JSON Đối tượng Python tương đương Vô giá trị Không có Mục tiêu Từ điển mảng danh sách Boolean sai (Sai) Sai Boolean đúng (True) Thật Số - int int Số - thực Trôi nổi chuỗi Chuỗi (str) Bây giờ chúng tôi sẽ hướng tới các ví dụ sẽ giúp chúng tôi giải mã dữ liệu JSON thành các đối tượng python tương đương ví dụ 3. JSON. tải ()json. loading() cho phép bạn chuyển đổi một chuỗi JSON thành một đối tượng python tương đương (Cụ thể là từ điển python). Xem mã dưới đây {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10} 0Ở đây, chúng ta có một đối tượng json có tên my_details_json. Chúng ta có thể sử dụng hàm type() để kiểm tra xem nó có thực sự là một chuỗi json hay không. Sau đó, chúng tôi đã sử dụng json. loading() để giải mã đối tượng json thành một từ điển python tương đương và kiểm tra cả kiểu của nó (nó phải là dict). Xem đầu ra như hình dưới đây Chuyển đổi chuỗi JSON thành Từ điển Python tương đương Ví dụ 4. JSON. trọng tải()Bây giờ, chúng ta sẽ xem một ví dụ nơi chúng ta sử dụng json. load() để chuyển đổi/giải mã tệp JSON thành đối tượng python (từ điển). Hãy nhớ rằng, trong ví dụ 2, chúng tôi đã tạo một tệp JSON có tên là Data_File. json. Chúng tôi sẽ sử dụng cùng một tệp làm nguồn vào ví dụ này và áp dụng json. load() để giải mã nó thành từ điển python. Xem ví dụ bên dưới {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10} 1Ở đây, chúng tôi đang sử dụng chức năng mở I/O tích hợp sẵn của python để đọc tên tệp json Data_File và sau đó sử dụng json. load() để chuyển đổi dữ liệu từ tệp đó thành một đối tượng python có liên quan (i. e. một cuốn từ điển). Xem đầu ra bên dưới Chuyển đổi dữ liệu từ đối tượng tệp json thành đối tượng python bằng json. phương thức tải () Vâng, chúng tôi sẽ kết thúc bài viết này tại đây với các điểm tóm tắt sau (Blog được đề xuất. Làm cách nào để chúng tôi triển khai món súp đẹp mắt để quét web?) Tóm lược
(Phải đọc. 20 câu hỏi phỏng vấn Python)
|