我有一些Python代码,可以使用工厂类方法将JSON解析为对象。在
下面是一个这样的类的示例:class Rect(object):
def __init__(self, x, y, width, height):
self.x = int(x)
self.y = int(y)
self.width = int(width)
self.height = int(height)
@classmethod
def from_dict(cls, raw_dict):
return cls(**raw_dict)
@classmethod
def from_json(cls, raw_json):
d = json.loads(raw_json)
return cls.from_dict(d)
当我传递raw时,python将JSON序列化到类中,它可以正常工作,但是如果我从Flask的web请求传入JSON(例如,从Flask的request.json)中传入JSON,那么在类实例化时会出现一个错误:TypeError: init() keywords must be strings
这是因为我从Flask请求返回的JSON都是unicode,显然{}无法理解unicode键。在
换言之,这是有效的:
^{pr2}$
但这不会:Rect.from_dict({u'y': 0, u'width': 0, u'x': 0, u'height': 0})
我的问题实际上是两部分:我应该如何解决这个问题?我是否应该尝试将所有传入的JSON表单unicode转换为字符串?或者我应该设法适应unicode?在
为什么这是个问题?Python不应该自动将unicode作为字符串进行消化吗?这个问题在Ruby这样的语言中表现出来了吗?(注意:在对this question的回答中,人们建议保持unicode,因为这是JSON规范,但显然Python不允许用unicode简单地替换字符串,否则我的代码就可以工作了。)
更新:
这个问题只在Python<;=2.6中表现出来。在