将dict转换为JSON对象时遇到了一些麻烦。我有这门课:
class ServerResponse(object):
status = None
code = None
message = None
data = None
OK_STATUS = True
ERROR_STATUS = False
OK_CODE = 200
def __init__(self, status=OK_STATUS, code=OK_CODE, message=None, data=None, *args, **kwargs):
self.status = status
self.code = code
self.message = message
self.data = data
def to_dict(self):
fields = {
"status": self.status,
"code": self.code,
"message": self.message,
"data": str(self.data),
}
return fields
def to_json(self):
return json.dumps(self.to_dict())
def __str__(self):
return self.to_json()
我使用此类生成服务器答案。
from server_response import ServerResponse as Response
...
return_data = {}
for (name, content) in result.items():
if not previous_hashes or client.is_data_change(previous_hashes[name], data['hash']):
return_data[name] = Response(data=content)
else:
return_data[name] = Response(code=201, message="Data has not changed")
response = Response(data=return_data)
...
self.write(str(response))
从服务器回答我得到下一个JSON
{u'status': True, u'message': None, u'code': 200, u'data': u"{'client': <server_response.ServerResponse object at 0x14e9710>, 'service': <server_response.ServerResponse object at 0x14e90d0>}"}
为什么__str__
函数不会递归调用?
答案 0 :(得分:2)
"data": str(self.data),
字符串化dict使用每个键和值的repr,而不是str()。
def to_dict(self):
fields = {
"status": self.status,
"code": self.code,
"message": self.message,
}
if self.data is None:
fields["data"] = None
else:
fields["data"] = self.data.to_dict()
return fields
def to_json(self):
return json.dumps(self.to_dict())
答案 1 :(得分:2)
从这个程序:
class Foo(object):
def __repr__(self):
return "REPR"
def __str__(self):
return "STR"
x = {}
x['client'] = Foo()
print str(x)
print repr(x)
你可以看到dict总是在其成员上调用 repr ,无论是否在dict上使用了str或repr。