Điều này sẽ làm việc tuyệt vời nói chung. Có một số trường hợp ngoại lệ, e. g. nếu những điều đặc biệt xảy ra trong __new__
, hoặc nhiều phép thuật siêu cấp hơn đang diễn ra
Rõ ràng tải cũng hoạt động [nếu không thì vấn đề là gì]
from json_tricks import loads
json_str = loads[json_str]
Điều này giả định rằng module_name.test_class.MyTestCls
có thể được nhập và không bị thay đổi theo những cách không tương thích. Bạn sẽ lấy lại một phiên bản, không phải một số từ điển hay thứ gì đó, và nó phải là một bản sao giống hệt với bản bạn đã hủy
Nếu bạn muốn tùy chỉnh cách thứ gì đó được [khử] tuần tự hóa, bạn có thể thêm các phương thức đặc biệt vào lớp của mình, như vậy
class CustomEncodeCls:
def __init__[self]:
self.relevant = 42
self.irrelevant = 37
def __json_encode__[self]:
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__[self, **attrs]:
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
chỉ tuần tự hóa một phần của các tham số thuộc tính, làm ví dụ
Và như một phần thưởng miễn phí, bạn nhận được [khử] tuần tự hóa các mảng khó hiểu, ngày & giờ, bản đồ được sắp xếp, cũng như khả năng đưa nhận xét vào json
JSON [Ký hiệu đối tượng JavaScript] là một định dạng văn bản không phụ thuộc vào ngôn ngữ và thường được sử dụng để trao đổi dữ liệu giữa các ứng dụng khác nhau. Một ví dụ điển hình là các phản hồi từ API thường ở định dạng JSON, do đó backend và frontend có thể tự do trao đổi dữ liệu mà không cần biết chi tiết kỹ thuật của nhau. Trong bài đăng này, chúng tôi sẽ giới thiệu các trường hợp sử dụng phổ biến của JSON trong Python, một ngôn ngữ phổ biến để phát triển phụ trợ và kỹ thuật/phân tích dữ liệu
JSON và từ điển
Đầu tiên, chúng ta nên biết rằng JSON là một định dạng chuỗi. Do đó, nó khác với kiểu dữ liệu từ điển trong Python. Chuỗi JSON có thể được phân tích thành dữ liệu tương ứng trong bất kỳ ngôn ngữ lập trình hiện đại nào. Thông thường, một chuỗi JSON có thể được phân tích thành hai loại dữ liệu là đối tượng và mảng. Một đối tượng là một tập hợp các cặp khóa/giá trị không có thứ tự và tương ứng với kiểu dữ liệu từ điển trong Python, trong khi một mảng là một tập hợp các giá trị có thứ tự và tương ứng với kiểu dữ liệu danh sách trong Python
Chuyển đổi giữa chuỗi JSON và dữ liệu
Như đã đề cập ở trên, một chuỗi JSON có thể được phân tích thành một đối tượng hoặc một mảng và ngược lại, trong tất cả các ngôn ngữ lập trình hiện đại. Trong Python, thư viện json
có thể được sử dụng cho loại chuyển đổi này. Chúng tôi sử dụng hàm loads
để chuyển đổi chuỗi JSON thành một đối tượng hoặc một mảng và sử dụng hàm dumps
để thực hiện chuyển đổi ngược lại. Lưu ý rằng s
trong loads
và dumps
là viết tắt của chuỗi có nghĩa là chúng hoạt động trên chuỗi JSON. Nếu s
không được chỉ định, thì các hàm sẽ hoạt động với các tệp JSON, sẽ được giới thiệu sau
Đoạn mã dưới đây minh họa các chuyển đổi phổ biến giữa chuỗi JSON và đối tượng/mảng
Thật thú vị, khi chúng tôi kết xuất mảng trở lại JSON, kết quả sẽ khác với kết quả ban đầu. Nếu bạn kiểm tra kỹ, bạn sẽ thấy một sự khác biệt tinh tế. Khi chúng tôi không chỉ định dấu phân cách, khoảng trắng sẽ được thêm vào sau dấu phân cách mục theo mặc định là dấu phẩy. Chúng tôi có thể chỉ định một dấu phân cách tùy chỉnh để làm cho kết quả giống nhau. Lưu ý rằng chúng tôi cần chỉ định cả dấu tách mục và dấu tách khóa ngay cả khi chúng tôi chỉ muốn thay đổi một trong số chúng
Trên thực tế, tham số
class CustomEncodeCls:
def __init__[self]:
self.relevant = 42
self.irrelevant = 37
def __json_encode__[self]:
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__[self, **attrs]:
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
1 được sử dụng phổ biến hơn để tùy chỉnh biểu diễn của đối tượng JSON. Chúng ta có thể sử dụng các dấu tách khác nhau để làm cho chuỗi kết xuất trở nên nhỏ gọn hơn hoặc dễ đọc hơn với con ngườiTham số
class CustomEncodeCls:
def __init__[self]:
self.relevant = 42
self.irrelevant = 37
def __json_encode__[self]:
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__[self, **attrs]:
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
2 được sử dụng để chèn một số khoảng trắng trước mỗi phím để cải thiện khả năng đọc. Và tham số class CustomEncodeCls:
def __init__[self]:
self.relevant = 42
self.irrelevant = 37
def __json_encode__[self]:
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__[self, **attrs]:
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
3 được sử dụng để sắp xếp các khóa theo thứ tự bảng chữ cáiThêm bộ tuần tự hóa tùy chỉnh cho các giá trị không thể được sắp xếp theo thứ tự
Trong ví dụ trên, tất cả các giá trị của từ điển đích [loads
0] có thể được đánh số thứ tự. Trong thực tế, có thể có một số giá trị không thể đánh số thứ tự, đặc biệt là các loại loads
1 và loads
2/loads
3
Trong trường hợp này, chúng ta cần tạo một chức năng nối tiếp tùy chỉnh và đặt nó thành tham số loads
4
Lưu ý rằng trong bộ nối tiếp tùy chỉnh, chúng tôi sử dụng loads
5 trong chuỗi f để hiển thị biểu diễn giá trị, có thể hữu ích cho mục đích gỡ lỗi. Nếu bạn bỏ ghi chú một trong các điều kiện của loads
6 và chạy lại lệnh loads
7, bạn sẽ thấy lỗi tương ứng
So sánh sự khác biệt giữa hai JSON
Đôi khi chúng ta cần so sánh sự khác biệt giữa hai đối tượng JSON. Ví dụ: chúng tôi có thể kiểm tra và so sánh lược đồ của một số bảng có thể được xuất dưới dạng JSON và đưa ra một số cảnh báo nếu lược đồ của một số bảng quan trọng bị thay đổi
Thư viện loads
8 có thể được sử dụng để so sánh sự khác biệt giữa hai đối tượng JSON trong Python
Nếu chúng tôi muốn kiểm soát cách hiển thị kết quả, chúng tôi có thể sử dụng các tham số loads
9, dumps
0 và dumps
1 để tùy chỉnh kết quả
Chúng ta có thể sử dụng trường loads
9 để chỉ định cách hiển thị các giá trị và hành động
Chúng ta có thể sử dụng tham số dumps
3 để tải dữ liệu từ các chuỗi JSON và tương tự sử dụng tham số dumps
1 để kết xuất kết quả thành một chuỗi JSON, có thể được ghi trực tiếp vào một tệp, sẽ sớm được giới thiệu
Đọc và viết JSON
Chúng ta có thể viết một chuỗi JSON vào một tệp bằng hàm dumps
5. Lưu ý rằng không có s
trong tên hàm. Cái có s
[_______57] là để làm việc với chuỗi, không phải tệp. Tệp JSON chỉ là một tệp văn bản thuần túy và phần mở rộng theo mặc định là dumps
9. Hãy viết sự khác biệt giữa hai lược đồ được trả về bởi s
0 vào một tệp có tên s
1
Một tệp có tên s
1 sẽ được tạo và sẽ chứa chuỗi JSON chứa trong biến s
3. Nếu các giá trị của từ điển/danh sách chứa dữ liệu không thể tuần tự hóa, chúng ta cần chỉ định tham số loads
4 với chức năng tuần tự hóa như được trình bày ở đầu bài đăng này
Cuối cùng, chúng ta có thể sử dụng hàm s
5 để tải dữ liệu từ tệp JSON
Trong bài đăng này, những điều cơ bản về JSON và cách sử dụng nó trong Python được giới thiệu với các ví dụ đơn giản. Chúng ta đã học cách đọc và viết các đối tượng JSON, từ một chuỗi hoặc từ một tệp. Ngoài ra, bây giờ chúng ta đã biết cách viết một trình tuần tự hóa tùy chỉnh cho các đối tượng JSON chứa dữ liệu không thể được tuần tự hóa bởi trình tuần tự hóa mặc định. Cuối cùng, chúng ta có thể sử dụng thư viện s
0 để so sánh sự khác biệt giữa hai đối tượng JSON, điều này có thể hữu ích cho việc theo dõi dữ liệu