# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved. #
# This file is part of the AiiDA code. #
# #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file #
# For further information please visit http://www.aiida.net #
###########################################################################
"""
Abstracts JSON usage to ensure compatibility with Python2 and Python3.
Use this module prefentially over standard json to ensure compatibility.
"""
import simplejson
[docs]def dump(data, fhandle, **kwargs):
"""
Write JSON encoded 'data' to a file-like object, fhandle
Use open(filename, 'wb') to write.
The utf8write object is used to ensure that the resulting serialised data is
encoding as UTF8.
Any strings with non-ASCII characters need to be unicode strings.
We use ensure_ascii=False to write unicode characters specifically
as this improves the readability of the json and reduces the file size.
"""
import codecs
utf8writer = codecs.getwriter('utf8')
simplejson.dump(data, utf8writer(fhandle), ensure_ascii=False, encoding='utf8', **kwargs)
[docs]def dumps(data, **kwargs):
"""
Write JSON encoded 'data' to a string.
simplejson is useful here as it always returns unicode if ensure_ascii=False is used,
unlike the standard library json, rather than being dependant on the input.
We use also ensure_ascii=False to write unicode characters specifically
as this improves the readability of the json and reduces the file size.
When writing to file, use open(filename, 'w', encoding='utf8')
"""
return simplejson.dumps(data, ensure_ascii=False, encoding='utf8', **kwargs)
[docs]def load(fhandle, **kwargs):
"""
Deserialise a JSON file.
For encoding consistency, open(filename, 'r', encoding='utf8') should be used.
:raises ValueError: if no valid JSON object could be decoded
"""
try:
return simplejson.load(fhandle, encoding='utf8', **kwargs)
except simplejson.errors.JSONDecodeError:
raise ValueError
[docs]def loads(json_string, **kwargs):
"""
Deserialise a JSON string.
:raises ValueError: if no valid JSON object could be decoded
"""
try:
return simplejson.loads(json_string, encoding='utf8', **kwargs)
except simplejson.errors.JSONDecodeError:
raise ValueError