Source code for xotl.tools.future.json

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------
# Copyright (c) Merchise Autrement [~º/~] and Contributors
# All rights reserved.
#
# This is free software; you can do what the LICENCE file allows you to.
#

"""Extensions to the `json` standard library module.

It just adds the ability to encode/decode datetimes. But you should use the
JSONEncoder yourself.

You may use this module as drop-in replacement to Python's `json`.  Also it
contains definitions to use C library JSON speedups or Python replacements in
case that library is not installed in your system.

"""

# TODO: consider use IoC to extend python json module

import json as _stdlib  # noqa
from json import *  # noqa
from json import __all__  # noqa

__all__ = list(__all__) + ["file_load", "encode_string"]

from json import decoder, encoder  # noqa


[docs]class JSONEncoder(_stdlib.JSONEncoder): __doc__ = ( _stdlib.JSONEncoder.__doc__ + """ xotl.tools extends this class by supporting the following data-types (see `default`:meth: method): - `datetime`, `date` and `time` values, which are translated to strings using ISO format. - `Decimal` values, which are represented as a string representation. - Iterables, which are represented as lists. """ ) DATE_FORMAT = str("%Y-%m-%d") TIME_FORMAT = str("%H:%M:%S") DT_FORMAT = str("%s %s") % (DATE_FORMAT, TIME_FORMAT) def default(self, obj): from collections.abc import Iterable from datetime import date, datetime, time from decimal import Decimal if isinstance(obj, datetime): return obj.strftime(self.DT_FORMAT) elif isinstance(obj, date): return obj.strftime(self.DATE_FORMAT) elif isinstance(obj, time): return obj.strftime(self.TIME_FORMAT) elif isinstance(obj, Decimal): return str(obj) elif isinstance(obj, Iterable): return list(iter(obj)) return super().default(obj)
try: # New in version 3.5 of standard module. JSONDecodeError # noqa except NameError: # Previous implementations raise 'ValueError' JSONDecodeError = ValueError def file_load(filename): with file(filename, "r") as f: return load(f) # noqa # --- encode strings --- from json.encoder import encode_basestring # noqa try: from _json import encode_basestring_ascii except ImportError: from json.encoder import py_encode_basestring_ascii as encode_basestring_ascii # noqa
[docs]def encode_string(string, ensure_ascii=True): """Return a JSON representation of a Python string. :param ensure_ascii: If True, the output is guaranteed to be of type `str` with all incoming non-ASCII characters escaped. If False, the output can contain non-ASCII characters. """ encode = encode_basestring_ascii if ensure_ascii else encode_basestring return encode(string)