将Python对象列表序列化为JSON

时间:2018-12-18 15:49:10

标签: python json dictionary serialization defaultdict

我搜索了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。如果我用泡菜,我   由于它以二进制格式转储,因此无法查看。

我做错了什么吗?

1 个答案:

答案 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