@ -20,6 +20,7 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import copy
import json
import os
import stat
import subprocess
@ -73,24 +74,30 @@ 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 :
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 ) :
new_data = AnsibleUnicode ( new_data )
new_data . ansible_pos = data . ansible_pos
return new_data
# 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
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
def load_from_file ( self , file_name ) :
''' Loads data from a file, which can contain either JSON or YAML. '''