我知道我能做到:
import datetime
def default(o):
if type(o) is datetime.datetime:
return o.isoformat()
data = {'a': datetime.datetime.today()}
json.dumps(data, default=default)
# '{"a": "2015-01-22T01:04:23.121392"}'
这很完美。现在如果我有日期时间作为我的键会怎样:
data = {datetime.datetime.today(): 'a'}
如果我尝试同样的操作,它会失败并显示:
TypeError: keys must be a string
有什么方法可以做类似的事情,即自定义转换器但用于键?
注意:这只是一个简单的例子。我有一个深层嵌套的字典结构,其中一些键不是字符串。
编辑:嵌套示例,但请注意我无法控制数据结构,它来自外部函数:
data = {'a': {datetime.datetime.today(): '1'}}
最佳答案
你可以这样做:
class DatesToStrings(json.JSONEncoder):
def _encode(self, obj):
if isinstance(obj, dict):
def transform_date(o):
return self._encode(o.isoformat() if isinstance(o, datetime) else o)
return {transform_date(k): transform_date(v) for k, v in obj.items()}
else:
return obj
def encode(self, obj):
return super(DatesToStrings, self).encode(self._encode(obj))
>>> json.dumps({"a": {datetime.now(): 3}}, cls=DatesToStrings)
'{"a": {"2015-01-22T11:49:25.910261": 3}}'
关于python - JSON 序列化非字符串字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28079221/