5

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__関数が再帰的に呼び出されないのはなぜですか?

4

2 に答える 2

4

このプログラムから:

class Foo(object):
    def __repr__(self):
        return "REPR"

    def __str__(self):
        return "STR"

x = {}

x['client'] = Foo()

print str(x)
print repr(x)

dict で str または repr が使用されたかどうかに関係なく、 dict は常にそのメンバーに対してreprを呼び出すことがわかります。

于 2013-11-13T09:33:14.940 に答える
2
"data": str(self.data),

dict を文字列化すると、str() ではなく、各キーと値の repr が使用されます。

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())
于 2013-11-12T19:07:03.470 に答える