[英]Serialize List of Python Objects to JSON
我搜索了SO的帖子,但找不到解決我問題的方法。 我看過很多SO帖子,這些帖子解釋了如何序列化python對象,但是卻找不到任何東西可以解釋如何序列化python對象列表的字典。
這是問題說明和示例用例:
import json
import collections
from collections import defaultdict
class A:
def __init__(self, a1_list=[], a2_str=None):
self.a1_list = []
self.a2_str = a2_str
class B:
def __init__(self, list_of_A_objects=[], b2_str=None):
self.list_of_A_objects = list_of_A_objects
self.b2_str = b2_str
if __name__ == "__main__":
a1 = A([1, 2, 3], '123')
a2 = A([4, 5, 6], '456')
b1 = B([a1, a2], '123-456')
a3 = A([11, 22, 33], '112233')
a4 = A([44, 55, 66], '445566')
b2 = B([a3, a4], '112233-445566')
dict_b = defaultdict(list)
dict_b['b'].append(b1)
dict_b['b'].append(b2)
json.dumps(dict_b)
在最后一行json.dumps(dict_b)
拋出錯誤
TypeError:“ B”類型的對象不可JSON序列化
編輯:
我已經嘗試了@coldspeed在注釋中建議的泡菜,但是我想用文本編輯器查看轉儲的JSON。 如果使用泡菜,因為它是以二進制格式轉儲的,所以無法查看。
我做錯了什么嗎?
您可以定義一個方法,使用json.dumps
將類轉儲到json。
import json
from collections import defaultdict
class A:
def __init__(self, items=[], string=None):
self.items = items
self.string = string
def toJSON(self):
return json.dumps(self, default=lambda obj: obj.__dict__)#, sort_keys=True, indent=4)
if __name__ == "__main__":
a1 = A([1, 2, 3], '123')
a2 = A([4, 5, 6], '456')
b1 = A([a1, a2], '123-456')
print(b1.toJSON())
# Result: {"items": [{"items": [1, 2, 3], "string": "123"}, {"items": [4, 5, 6], "string": "456"}], "string": "123-456"}
a3 = A([11, 22, 33], '112233')
a4 = A([44, 55, 66], '445566')
b2 = A([a3, a4], '112233-445566')
dict_b = defaultdict(list)
dict_b['b'].append(b1.toJSON())
dict_b['b'].append(b2.toJSON())
print(json.dumps(dict_b))
缺點您將始終擁有該類的序列化版本。 為了避免這種副作用,您可以設置一個新方法將其轉換為帶有loads
的字典
def to_dict(self):
return json.loads(self.toJSON())
並在object.to_dict
追加object.to_dict
dict_b = defaultdict(list)
dict_b['b'].append(b1.to_dict())
dict_b['b'].append(b2.to_dict())
print(json.dumps(dict_b))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.