python - JSON 序列化非字符串字典键

标签 python json

我知道我能做到:

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/

相关文章:

python - Django Rest Framework 自定义权限验证

python - 如何正确删除特定的 ManyToMany 关系?

javascript - 如何将json数据发送到apache wicket中的javascript?

python - 追加到空列表和重新分配它有什么区别?

python - 了解矩阵到列表列表,然后是 Numpy 数组

python - 在 Python 中生成 3D 希尔伯特空间填充曲线的算法

json - 使用 Lift-JSON 解析动态值

html - 如何调用团队名称/文本并以 html 显示。 the/is messing it up 搞砸了

json - 我如何识别这种类似 JSON 的数据结构?

java - 如何从 WebTau 响应正文 Map<String,?> 表示中检索 Long 值?