Source code for omas.omas_json
'''save/load from JSON routines
-------
'''
from .omas_utils import *
from .omas_core import ODS, ODC
# ---------------------------
# save and load OMAS to Json
# ---------------------------
[docs]def save_omas_json(ods, filename, objects_encode=None, **kw):
"""
Save an ODS to Json
:param ods: OMAS data set
:param filename: filename or file descriptor to save to
:param objects_encode: how to handle non-standard JSON objects
* True: encode numpy arrays, complex, and uncertain
* None: numpy arrays as lists, encode complex, and uncertain
* False: numpy arrays as lists, fail on complex, and uncertain
:param kw: arguments passed to the json.dumps method
"""
printd('Saving OMAS data to Json: %s' % filename, topic=['Json', 'json'])
kw.setdefault('indent', 0)
kw.setdefault('separators', (',', ': '))
kw.setdefault('sort_keys', True)
json_string = json.dumps(ods, default=lambda x: json_dumper(x, objects_encode), **kw)
if isinstance(filename, str):
with open(filename, 'w') as f:
f.write(json_string)
else:
f = filename
f.write(json_string)
[docs]def load_omas_json(filename, consistency_check=True, imas_version=omas_rcparams['default_imas_version'], cls=ODS, **kw):
"""
Load ODS or ODC from Json
:param filename: filename or file descriptor to load from
:param consistency_check: verify that data is consistent with IMAS schema
:param imas_version: imas version to use for consistency check
:param cls: class to use for loading the data
:param kw: arguments passed to the json.loads mehtod
:return: OMAS data set
"""
printd('Loading OMAS data from Json: %s' % filename, topic='json')
if isinstance(filename, str):
with open(filename, 'r') as f:
json_string = f.read()
else:
json_string = filename.read()
# allow for empty json file
if not len(json_string.strip()):
return ODS(imas_version=imas_version, consistency_check=consistency_check)
def base_class(x):
clsODS = lambda: ODS(imas_version=imas_version, consistency_check=False)
clsODC = lambda: ODC(imas_version=imas_version, consistency_check=False)
try:
tmp = json_loader(x, clsODS, null_to=numpy.nan)
except Exception:
tmp = json_loader(x, clsODC, null_to=numpy.nan)
return tmp
tmp = json.loads(json_string, object_pairs_hook=lambda x: base_class(x), **kw)
# convert to cls
tmp.__class__ = cls
# perform consistency check
tmp.consistency_check = consistency_check
return tmp
[docs]def through_omas_json(ods, method=['function', 'class_method'][1]):
"""
Test save and load OMAS Json
:param ods: ods
:return: ods
"""
filename = omas_testdir(__file__) + '/test.json'
ods = copy.deepcopy(ods) # make a copy to make sure save does not alter entering ODS
if method == 'function':
save_omas_json(ods, filename)
ods1 = load_omas_json(filename)
else:
ods.save(filename)
ods1 = ODS().load(filename)
return ods1