如何使用JSON.loads转换为Python datetime对象?

2024-05-13 22:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON对象的字符串表示。

dumped_dict = '{"debug": false, "created_at": "2020-08-09T11:24:20"}'

当我用这个对象调用json.loads时

json.loads(dumped_dict)

我得到了

{'created_at': '2020-08-09T11:24:20', 'debug': False}

这里没什么问题。不过,我想知道是否有办法用json.loads将上面的对象转换成如下内容:

{'created_at': datetime.datetime(2020, 08, 09, 11, 24, 20), 'debug': False}

很快,我们就可以在 调用json.loads?


Tags: 对象字符串debugjsonfalse内容datetimedict
3条回答

您需要传递一个对象钩子。从documentation

object_hook is an optional function that will be called with the result of any object literal decoded (a dict). The return value of object_hook will be used instead of the dict.

像这样:

import datetime
import json

def date_hook(json_dict):
    for (key, value) in json_dict.items():
        try:
            json_dict[key] = datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S")
        except:
            pass
    return json_dict

dumped_dict = '{"debug": false, "created_at": "2020-08-09T11:24:20"}'
loaded_dict = json.loads(dumped_dict, object_hook=date_hook)

如果还想处理时区,则必须使用dateutil而不是strptime。

到目前为止我的解决方案是:

>>> json_string = '{"last_updated": {"$gte": "Thu, 1 Mar 2012 10:00:49 UTC"}}'
>>> dct = json.loads(json_string, object_hook=datetime_parser)
>>> dct
{u'last_updated': {u'$gte': datetime.datetime(2012, 3, 1, 10, 0, 49)}}


def datetime_parser(dct):
    for k, v in dct.items():
        if isinstance(v, basestring) and re.search("\ UTC", v):
            try:
                dct[k] = datetime.datetime.strptime(v, DATE_FORMAT)
            except:
                pass
    return dct

有关使用对象挂钩的进一步参考:JSON encoder and decoder

在我的例子中,json字符串来自对REST API的GET请求。此解决方案允许我透明地“获取正确的日期”,而不必强制客户机和用户将诸如__date__之类的前缀硬编码到JSON中,只要输入字符串符合日期格式,即:

DATE_FORMAT = '%a, %d %b %Y %H:%M:%S UTC'

regex模式可能需要进一步改进

PS:如果您想知道,json_字符串是一个MongoDB/PyMongo查询。

我将按照Nicola建议的那样做两个更改:

  1. 使用dateutil.parser而不是datetime.datetime.strptime
  2. 明确定义要捕获的异常。我通常建议不要使用空的except:

或代码:

import dateutil.parser

def datetime_parser(json_dict):
    for (key, value) in json_dict.items():
        try:
            json_dict[key] = dateutil.parser.parse(value)
        except (ValueError, AttributeError):
            pass
    return json_dict

str = "{...}"  # Some JSON with date
obj = json.loads(str, object_hook=datetime_parser)
print(obj)

相关问题 更多 >