Commit b186676e by Toshio Kuratomi

Clean up jsonify and make json_dict_*to* more flexible at the same time.

parent f976d47f
...@@ -65,6 +65,7 @@ import pwd ...@@ -65,6 +65,7 @@ import pwd
import platform import platform
import errno import errno
import tempfile import tempfile
from itertools import imap, repeat
try: try:
import json import json
...@@ -234,7 +235,7 @@ def load_platform_subclass(cls, *args, **kwargs): ...@@ -234,7 +235,7 @@ def load_platform_subclass(cls, *args, **kwargs):
return super(cls, subclass).__new__(subclass) return super(cls, subclass).__new__(subclass)
def json_dict_unicode_to_bytes(d): def json_dict_unicode_to_bytes(d, encoding='utf-8'):
''' Recursively convert dict keys and values to byte str ''' Recursively convert dict keys and values to byte str
Specialized for json return because this only handles, lists, tuples, Specialized for json return because this only handles, lists, tuples,
...@@ -242,17 +243,17 @@ def json_dict_unicode_to_bytes(d): ...@@ -242,17 +243,17 @@ def json_dict_unicode_to_bytes(d):
''' '''
if isinstance(d, unicode): if isinstance(d, unicode):
return d.encode('utf-8') return d.encode(encoding)
elif isinstance(d, dict): elif isinstance(d, dict):
return dict(map(json_dict_unicode_to_bytes, d.iteritems())) return dict(imap(json_dict_unicode_to_bytes, d.iteritems(), repeat(encoding)))
elif isinstance(d, list): elif isinstance(d, list):
return list(map(json_dict_unicode_to_bytes, d)) return list(imap(json_dict_unicode_to_bytes, d, repeat(encoding)))
elif isinstance(d, tuple): elif isinstance(d, tuple):
return tuple(map(json_dict_unicode_to_bytes, d)) return tuple(imap(json_dict_unicode_to_bytes, d, repeat(encoding)))
else: else:
return d return d
def json_dict_bytes_to_unicode(d): def json_dict_bytes_to_unicode(d, encoding='utf-8'):
''' Recursively convert dict keys and values to byte str ''' Recursively convert dict keys and values to byte str
Specialized for json return because this only handles, lists, tuples, Specialized for json return because this only handles, lists, tuples,
...@@ -260,13 +261,13 @@ def json_dict_bytes_to_unicode(d): ...@@ -260,13 +261,13 @@ def json_dict_bytes_to_unicode(d):
''' '''
if isinstance(d, str): if isinstance(d, str):
return unicode(d, 'utf-8') return unicode(d, encoding)
elif isinstance(d, dict): elif isinstance(d, dict):
return dict(map(json_dict_bytes_to_unicode, d.iteritems())) return dict(imap(json_dict_bytes_to_unicode, d.iteritems(), repeat(encoding)))
elif isinstance(d, list): elif isinstance(d, list):
return list(map(json_dict_bytes_to_unicode, d)) return list(imap(json_dict_bytes_to_unicode, d, repeat(encoding)))
elif isinstance(d, tuple): elif isinstance(d, tuple):
return tuple(map(json_dict_bytes_to_unicode, d)) return tuple(imap(json_dict_bytes_to_unicode, d, repeat(encoding)))
else: else:
return d return d
...@@ -1189,13 +1190,17 @@ class AnsibleModule(object): ...@@ -1189,13 +1190,17 @@ class AnsibleModule(object):
self.fail_json(msg='Boolean %s not in either boolean list' % arg) self.fail_json(msg='Boolean %s not in either boolean list' % arg)
def jsonify(self, data): def jsonify(self, data):
for encoding in ("utf-8", "latin-1", "unicode_escape"): for encoding in ("utf-8", "latin-1"):
try: try:
return json.dumps(data, encoding=encoding) return json.dumps(data, encoding=encoding)
# Old systems using simplejson module does not support encoding keyword. # Old systems using old simplejson module does not support encoding keyword.
except TypeError, e: except TypeError:
return json.dumps(data) try:
except UnicodeDecodeError, e: new_data = json_dict_bytes_to_unicode(data, encoding=encoding)
except UnicodeDecodeError:
continue
return json.dumps(new_data)
except UnicodeDecodeError:
continue continue
self.fail_json(msg='Invalid unicode encoding encountered') self.fail_json(msg='Invalid unicode encoding encountered')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment