diff --git a/lib/ansible/parsing/dataloader.py b/lib/ansible/parsing/dataloader.py index c54ba78f1f..b295560c93 100644 --- a/lib/ansible/parsing/dataloader.py +++ b/lib/ansible/parsing/dataloader.py @@ -20,7 +20,6 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type import copy -import json import os import stat import subprocess @@ -74,30 +73,24 @@ class DataLoader(): a JSON or YAML string. ''' + # YAML parser will take JSON as it is a subset. + if isinstance(data, AnsibleUnicode): + # The PyYAML's libyaml bindings use PyUnicode_CheckExact so + # they are unable to cope with our subclass. + # Unwrap and re-wrap the unicode so we can keep track of line + # numbers + in_data = text_type(data) + else: + in_data = data try: - # we first try to load this data as JSON - return json.loads(data) - except: - # if loading JSON failed for any reason, we go ahead - # and try to parse it as YAML instead + new_data = self._safe_load(in_data, file_name=file_name) + except YAMLError as yaml_exc: + self._handle_error(yaml_exc, file_name, show_content) - if isinstance(data, AnsibleUnicode): - # The PyYAML's libyaml bindings use PyUnicode_CheckExact so - # they are unable to cope with our subclass. - # Unwrap and re-wrap the unicode so we can keep track of line - # numbers - new_data = text_type(data) - else: - new_data = data - try: - new_data = self._safe_load(new_data, file_name=file_name) - except YAMLError as yaml_exc: - self._handle_error(yaml_exc, file_name, show_content) - - if isinstance(data, AnsibleUnicode): - new_data = AnsibleUnicode(new_data) - new_data.ansible_pos = data.ansible_pos - return new_data + if isinstance(data, AnsibleUnicode): + new_data = AnsibleUnicode(new_data) + new_data.ansible_pos = data.ansible_pos + return new_data def load_from_file(self, file_name): ''' Loads data from a file, which can contain either JSON or YAML. '''