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

时间:2014-12-20 23:07:09

标签: python json list sockets python-3.x

我在python中有一个class。我创建了一个包含此class个实例的列表。我想将此列表转换为json。这是我的class

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

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

{"IpPortList":{[]}}

修改 这是我的代码。但它不起作用:

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)

我想把这个json发送到socket。之后我想把json带到另一边。另一边我想把它转换成list。

1 个答案:

答案 0 :(得分: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}}

将数据转换为json:

json.dumps([o.dump() for o in my_list_of_ipport])

你甚至可以通过为你的JSON创建一个自定义编码器来使它更自动化,但这似乎有点过分。

编辑:

要回答关于加载部分的评论,如果您只想要一个dict json.loads列表,那么就可以了。如果你想要一个IpPort的列表,你必须要做到这一点,你要么做以下事情(考虑到你的转储词是扁平的):

ip_ports = [IpPort(**attrs) for attrs in json.loads(dumped_ipports)]

注意:**运算符将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'])

将其列为清单的方法:

my_ip_ports = [IpPort.load(dumped_ipport)
               for dumped_ipport in json.loads(dumped_stuff)]