Allow parsing null JSON data

This commit is contained in:
Aaron Tan
2017-07-26 13:53:33 -04:00
parent 6856c77a8e
commit b69321a91e
2 changed files with 32 additions and 1 deletions

View File

@@ -57,8 +57,10 @@ class JSONParser(parsers.JSONParser):
try: try:
data = stream.read().decode(encoding) data = stream.read().decode(encoding)
if not data:
return {}
obj = json.loads(data, object_pairs_hook=OrderedDict) obj = json.loads(data, object_pairs_hook=OrderedDict)
if not isinstance(obj, dict): if not isinstance(obj, dict) and obj is not None:
raise ParseError(_('JSON parse error - not a JSON object')) raise ParseError(_('JSON parse error - not a JSON object'))
return obj return obj
except ValueError as exc: except ValueError as exc:

View File

@@ -0,0 +1,29 @@
import pytest
import StringIO
# AWX
from awx.api.parsers import JSONParser
# Django REST Framework
from rest_framework.exceptions import ParseError
@pytest.mark.parametrize(
'input_, output', [
('{"foo": "bar"}', {'foo': 'bar'}),
('null', None),
('', {}),
]
)
def test_jsonparser_valid_input(input_, output):
input_stream = StringIO.StringIO(input_)
assert JSONParser().parse(input_stream) == output
input_stream.close()
@pytest.mark.parametrize('invalid_input', ['1', '"foobar"', '3.14', '{"foo": "bar",}'])
def test_json_parser_invalid_input(invalid_input):
input_stream = StringIO.StringIO(invalid_input)
with pytest.raises(ParseError):
JSONParser().parse(input_stream)
input_stream.close()