猿问

从包含对象子列表的 python 列表中获取 JSON 字符串?

我有一个名为 Data 的类,如下所示:


class Data:


    def __init__(self, ticker, comments, submissions):

        self.ticker = ticker

        self.comments = comments

        self.submissions = submissions

其中tickerastring是comments类型对象的列表Comment,submissions是类型 objectf 的列表Submission。Comment并Submission拥有自己的领域。


现在我有一个类型的对象列表Data


我想遍历列表并获取包含所有元素的 JSON 字符串并将其打印到文件中。


我的代码:


    json_string = json.dumps([ob.__dict__ for ob in data_list])

    f = open("data.json", "w")

    f.write(json_string)

    f.close()

这会引发以下类型的错误:


TypeError: Object of type Comment is not JSON serializable

我不知道我在这里做错了什么,有人知道吗?


编辑:


评论类:


class Comment:


def __init__(self, author_name, body, ups):

    self.author_name = author_name

    self.body = body

    self.ups = ups

所有字段都是字符串/整数


泛舟湖上清波郎朗
浏览 149回答 2
2回答

慕姐8265434

使用default=lambda x: x.__dict__应该可以帮助你。它会转换任何不可序列化的对象,你不必修改很多以前的代码import json# rest of your codewith open("file.json", "w+", encoding="utf-8") as file:    json.dump(datalist, file, default=lambda x: x.__dict__) #datalist is a list in my case编辑 :这是我测试时的完整代码:import jsonclass Data:    def __init__(self, ticker="string", comment=[], submissions=[]):        self.ticker = ticker        self.comments = comments        self.submissions = submissionsclass Comment:    def __init__(self, author_name="", body="", ups=1):        self.author_name = author_name        self.body = body        self.ups = upsclass Submission:    def __init__(self, author_name="", body="", ups=1):        self.author_name = author_name        self.body = body        self.ups = upscomments = [Comment(ups=i) for i in range(10)]submissions = [Submission(ups=2*i) for i in range(10)]datalist = [Data(comment=comments, submissions=submissions) for i in range(5)]with open("file.json", "w+", encoding="utf-8") as file:    json.dump(datalist, file, default=lambda x: x.__dict__)

蝴蝶刀刀

默认情况下不能序列化类。所以要么你必须手动序列化它,就像你处理Data类一样,要么使用自定义的 json 编码器。手动:class Data:   ...   def to_json(self):       res = self.__dict__       res['comments'] = self.comments.__dict__       return res然而这个解决方案并不是很灵活,所以最好使用自定义的 JSON 编码器,它将自动处理它在序列化过程中遇到的所有对象:# from top of my head something like this:from json import JSONEncoderclass MyEncoder(JSONEncoder):    def default(self, o):        # handle instance of `Data` during json.dump         if isinstance(o, Data):             return o.__dict__        # handle instance of `Comment` during json.dump        if isinstance(o, Comment):             return o.__dict__        return super().default(o)json.dumps(data_list, cls=MyEncoder) # custom encoder should handle it
随时随地看视频慕课网APP

相关分类

Python
我要回答