簡體   English   中英

將Python對象列表序列化為JSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM