如何在python中将对象列表转换为json格式

Akn*_*glu 1 python sockets json list python-3.x

我有一个classpython.我制作了一个包含这个class实例的列表.我想将此列表转换为json.这是我的class

class IpPort:
    def __init__(self,ip,port,time,status):
        self.ip=ip
        self.port=port
        self.time=time
        self.status=status
Run Code Online (Sandbox Code Playgroud)

我有list of这个object.我想将其转换listjson格式发送socket.但我不能.我怎样才能做到这一点?我希望它像:

{"IpPortList":{[]}}
Run Code Online (Sandbox Code Playgroud)

编辑 这是我的代码.但它不起作用:

li=list()

i1=IpPort("kk",12,None,"w")
i2=IpPort("kk",15,None,"s")

li.append(i1)
li.append(i2)

jsons= json.dumps(li)


s.send(jsons)
Run Code Online (Sandbox Code Playgroud)

我想这个JSON发送到我要带另一side.In对方再次,我想将它转化成列出JSON一个socket.After.

Ben*_*ier 8

您应该dump在对象中编写一个方法,并在将内容发送到json模块时使用它:

class IpPort:
    def __init__(self, ip, port, time, status):
        self.ip = ip
        self.port = port
        self.time = time
        self.status = status

    def dump(self):
        return {"IpPortList": {'ip': self.ip,
                               'port': self.port,
                               'time': self.time,
                               'status': self.status}}
Run Code Online (Sandbox Code Playgroud)

将数据转换为json时:

json.dumps([o.dump() for o in my_list_of_ipport])
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过为JSON创建自定义编码器来使其更加自动化,但这似乎有些过分.

编辑:

要回答有关加载部分的注释,如果您只是想要一个dict列表json.loads是要走的路.如果你想要一个列表,IpPort你必须要做的方法,你要么做到以下(考虑到你的倾销dicts是平的):

ip_ports = [IpPort(**attrs) for attrs in json.loads(dumped_ipports)]
Run Code Online (Sandbox Code Playgroud)

注意:**运算符将dict转换为关键字参数.

如果转储的dicts不是平的(这是你的情况),你应该创建一个静态方法load,它返回从转储创建的对象的实例:

class IpPort:
    ... blablabla ...

    @staticmethod
    def load(dumped_obj):
        return IpPort(dumped_obj['IpPortList']['ip'],
                      dumped_obj['IpPortList']['port'],
                      dumped_obj['IpPortList']['time'],
                      dumped_obj['IpPortList']['status'])
Run Code Online (Sandbox Code Playgroud)

以及使其成为列表的方式:

my_ip_ports = [IpPort.load(dumped_ipport)
               for dumped_ipport in json.loads(dumped_stuff)]
Run Code Online (Sandbox Code Playgroud)