【问题标题】:Serialize List of Python Objects to JSON将 Python 对象列表序列化为 JSON
【发布时间】:2018-12-18 15:49:09
【问题描述】:

我搜索了 SO 的帖子,但找不到解决问题的方法。我看过一堆解释如何序列化 python 对象的 SO 帖子,但没有找到任何解释如何序列化 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 在 cmets 中建议的泡菜,但我会 喜欢用文本编辑器查看转储的 JSON。如果我用泡菜,我 无法查看,因为它是以二进制格式转储的。

我做错了什么吗?

【问题讨论】:

标签: python json dictionary serialization defaultdict


【解决方案1】:

您可以使用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())

并且在 defaultdict 处追加 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))

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 2017-09-03
    • 2015-07-27
    • 2016-12-08
    • 2016-05-30
    • 2012-03-07
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多