diff --git a/postgrestutils/utils.py b/postgrestutils/utils.py index cf21a3fca42b2e96933464be13d075069ae16be9..35b6e9519287ca1fc5edf074a6986d0a68b8b7a4 100644 --- a/postgrestutils/utils.py +++ b/postgrestutils/utils.py @@ -1,7 +1,7 @@ import importlib.util import logging import re -from datetime import datetime, timedelta, timezone +from datetime import date, datetime, timedelta, timezone from typing import Dict, Union _DJANGO = importlib.util.find_spec("django") is not None @@ -71,6 +71,13 @@ def _try_python_parse_dt(value: str) -> Union[datetime, str]: _try_parse_dt = _try_django_parse_dt if _DJANGO else _try_python_parse_dt +def _try_parse_date(value: str) -> Union[date, str]: + try: + return datetime.strptime(value, "%Y-%m-%d").date() + except ValueError: + return value + + def datetime_parser(json_dict: dict) -> dict: """ A function to use as `object_hook` when deserializing JSON that parses @@ -78,7 +85,11 @@ def datetime_parser(json_dict: dict) -> dict: :param json_dict: the original `json_dict` to process :return: the modified `json_dict` """ + str_parsers = (_try_parse_dt, _try_parse_date) + for key, value in json_dict.items(): if isinstance(value, str): - json_dict[key] = _try_parse_dt(value) + for parser in str_parsers: + json_dict[key] = parser(value) + # json_dict[key] = _try_parse_dt(value) return json_dict