Nếu bạn không nhớ cài đặt gói cho nó, bạn có thể sử dụng json-trick :
pip install json-tricks
Sau đó, bạn chỉ cần nhập dump(s)
từ json_tricks
thay vì json và nó thường sẽ hoạt động:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
cái nào sẽ cho
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
Và cơ bản là vậy!
Đ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ệ, ví dụ: nếu những điều đặc biệt xảy ra __new__
, hoặc nhiều phép thuật siêu hình đang diễn ra.
Rõ ràng tải cũng hoạt động (nếu không thì điểm gì):
from json_tricks import loads
json_str = loads(json_str)
Điều này không cho rằng module_name.test_class.MyTestCls
có thể được nhập và không thay đổi theo những cách không tương thích. Bạn sẽ lấy lại một ví dụ , không phải một số từ điển hoặc một cái gì đó, và nó phải là một bản sao giống hệt với bản sao bạn đã bỏ.
Nếu bạn muốn tùy chỉnh cách một cái gì đó được (de) nối tiếp, 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
mà 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 (de) tuần tự hóa các mảng numpy, ngày & thời gian, bản đồ được đặt hàng, cũng như khả năng bao gồm các nhận xét trong json.
Tuyên bố miễn trừ trách nhiệm: Tôi đã tạo json_tricks , vì tôi gặp vấn đề tương tự như bạn.