|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Utilities for dealing with writing json strings. |
|
|
|
json_utils wraps json.dump and json.dumps so that they can be used to safely |
|
control the precision of floats when writing to json strings or files. |
|
""" |
|
import json |
|
import re |
|
|
|
|
|
def FormatFloat(json_str, float_digits): |
|
pattern = re.compile(r'\d+\.\d+') |
|
float_repr = '{:.' + '{}'.format(float_digits) + 'f}' |
|
def MRound(match): |
|
return float_repr.format(float(match.group())) |
|
return re.sub(pattern, MRound, json_str) |
|
|
|
|
|
def Dump(obj, fid, float_digits=-1, **params): |
|
"""Wrapper of json.dump that allows specifying the float precision used. |
|
|
|
Args: |
|
obj: The object to dump. |
|
fid: The file id to write to. |
|
float_digits: The number of digits of precision when writing floats out. |
|
**params: Additional parameters to pass to json.dumps. |
|
""" |
|
json_str = Dumps(obj, float_digits, **params) |
|
fid.write(json_str) |
|
|
|
|
|
def Dumps(obj, float_digits=-1, **params): |
|
"""Wrapper of json.dumps that allows specifying the float precision used. |
|
|
|
Args: |
|
obj: The object to dump. |
|
float_digits: The number of digits of precision when writing floats out. |
|
**params: Additional parameters to pass to json.dumps. |
|
|
|
Returns: |
|
output: JSON string representation of obj. |
|
""" |
|
json_str = json.dumps(obj, **params) |
|
if float_digits > -1: |
|
json_str = FormatFloat(json_str, float_digits) |
|
return json_str |
|
|
|
|
|
def PrettyParams(**params): |
|
"""Returns parameters for use with Dump and Dumps to output pretty json. |
|
|
|
Example usage: |
|
```json_str = json_utils.Dumps(obj, **json_utils.PrettyParams())``` |
|
```json_str = json_utils.Dumps( |
|
obj, **json_utils.PrettyParams(allow_nans=False))``` |
|
|
|
Args: |
|
**params: Additional params to pass to json.dump or json.dumps. |
|
|
|
Returns: |
|
params: Parameters that are compatible with json_utils.Dump and |
|
json_utils.Dumps. |
|
""" |
|
params['float_digits'] = 4 |
|
params['sort_keys'] = True |
|
params['indent'] = 2 |
|
params['separators'] = (',', ': ') |
|
return params |
|
|
|
|