"""Implementation of JSONEncoder """ import re try: from _json import make_encoder as c_make_encoder except ImportError: c_make_encoder = None import json from json.encoder import INFINITY, encode_basestring, encode_basestring_ascii class SrcField(str): def __new__(cls, *args, **kwargs): return super(SrcField, cls).__new__(cls, *args, **kwargs) class SrcFieldJSONEncoder(json.JSONEncoder): def iterencode(self, o, _one_shot=False): if self.check_circular: markers = {} else: markers = None if self.ensure_ascii: _encoder = encode_basestring_ascii else: _encoder = encode_basestring def floatstr(o, allow_nan=self.allow_nan, _repr=float.__repr__, _inf=INFINITY, _neginf=-INFINITY): # Check for specials. Note that this type of test is processor # and/or platform-specific, so do tests which don't depend on the # internals. if o != o: text = 'NaN' elif o == _inf: text = 'Infinity' elif o == _neginf: text = '-Infinity' else: return _repr(o) if not allow_nan: raise ValueError( "Out of range float values are not JSON compliant: " + repr(o)) return text def new_encoder(s) -> str: if type(s) is SrcField: return s return _encoder(s) if (_one_shot and c_make_encoder is not None and self.indent is None): _iterencode = c_make_encoder( markers, self.default, new_encoder, self.indent, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, self.allow_nan) else: _iterencode = json.encoder._make_iterencode( markers, self.default, new_encoder, self.indent, floatstr, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, _one_shot) return _iterencode(o, 0)