Làm cách nào để tuần tự hóa và giải tuần tự hóa JSON trong Python?

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

  1. nhập json
  2. jsonString = '{"tên". "ABC", "tuổi". 20, "giới tính". "Nam", "là_sinh viên". "Thật"}'
  3. người. __dict__ = json. tải [jsonString]
  4. in[f"người. Tên. {người. Tên}"]
  5. in[f"người. tuổi. {người. tuổi}"]
  6. in[f"người. giới tính. {người. giới tính}"]
  7. 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_hook

Phươ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 nhau

Cà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. jsonpickle

Phươ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ận

Vớ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

Làm cách nào để tuần tự hóa tệp JSON trong Python?

Mô-đun json hiển thị hai phương thức để tuần tự hóa các đối tượng Python thành định dạng JSON. dump[] sẽ ghi dữ liệu Python vào một đối tượng dạng tệp . Chúng tôi sử dụng điều này khi chúng tôi muốn tuần tự hóa dữ liệu Python của mình thành tệp JSON bên ngoài. dumps[] sẽ ghi dữ liệu Python vào một chuỗi ở định dạng JSON.

Làm cách nào để giải tuần tự hóa đối tượng JSON trong Python?

Để giải tuần tự hóa chuỗi thành một đối tượng lớp, bạn cần phải 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.

Tuần tự hóa JSON trong Python là gì?

Tuần tự hóa là quá trình chuyển đổi các đối tượng của các loại dữ liệu phức tạp [các lớp được xác định tùy chỉnh, trình ánh xạ quan hệ đối tượng, ngày giờ, v.v. ] thành các kiểu dữ liệu gốc để sau đó chúng có thể dễ dàng chuyển đổi thành ký hiệu JSON

Thư viện nào để tuần tự hóa JSON trong Python?

Vậy làm thế nào chúng ta có thể tuần tự hóa một đối tượng Python ở định dạng JSON? . dumps[] lấy một đối tượng Python và trả về một chuỗi có kết quả của quá trình tuần tự hóa JSON. import the JSON module and then use the dumps[] and loads[] functions: dumps[] takes a Python object and returns a string with the result of the JSON serialization process.

Chủ Đề