| """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): |
| |
| |
| |
|
|
| 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) |
|
|