我在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。
答案 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)]