我搜索了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。如果我用泡菜,我 由于它以二进制格式转储,因此无法查看。
我做错了什么吗?
答案 0 :(得分:0)
您可以定义一种方法,以使用AttributeError: void_invoice
将类转储到json。
json.dumps
缺点
您将始终拥有该类的序列化版本。为了避免这种副作用,您可以设置一个新方法,将其转换为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