为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2023-06-13 17:04:40
我有一个名为 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所有字段都是字符串/整数
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

使用default=lambda x: x.__dict__应该可以帮助你。它会转换任何不可序列化的对象,你不必修改很多以前的代码


import json

# rest of your code

with 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 json

class Data:

    def __init__(self, ticker="string", comment=[], submissions=[]):

        self.ticker = ticker

        self.comments = comments

        self.submissions = submissions



class Comment:

    def __init__(self, author_name="", body="", ups=1):

        self.author_name = author_name

        self.body = body

        self.ups = ups


class Submission:

    def __init__(self, author_name="", body="", ups=1):

        self.author_name = author_name

        self.body = body

        self.ups = ups


comments = [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__)


查看完整回答
反对 回复 2023-06-13
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

默认情况下不能序列化类。所以要么你必须手动序列化它,就像你处理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 JSONEncoder

class 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


查看完整回答
反对 回复 2023-06-13
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信