import orjson as json import re from datetime import datetime from typing import Any def str_to_date(value: Any) -> Any: """Recursive str to date. Args: value (Any): Any value. Returns: Any: date or original value. """ if isinstance(value, list): return [str_to_date(i) for i in value] if isinstance(value, str) and re.match(r"^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}\.*\d*$", value): return datetime.fromisoformat(value) if isinstance(value, str) and re.match(r"^\d{4}-\d{2}-\d{2}$", value): return datetime.strptime(value, "%Y-%m-%d").date() return value def decode_str(json_data: str): """Decode json string, correctly handle lists and dates. Args: json_data (str): JSON string. Returns: list or dict or flat value: Decoded data. """ data = json.loads(json_data) return str_to_date(data)