This commit makes the JSON parser raise an exception when handling objects or arrays whose declaration is incomplete, as in missing the closing marker (brace or bracket) and if the missing marker would have been the last non-whitespace character in the incoming string. Since CPython's JSON parser would raise an exception in such a case, unlike MicroPython's, this commit aligns MicroPython's behaviour with CPython. This commit fixes issue #17141. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
97 lines
2.1 KiB
Python
97 lines
2.1 KiB
Python
try:
|
|
import json
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
|
|
def my_print(o):
|
|
if isinstance(o, dict):
|
|
print("sorted dict", sorted(o.items()))
|
|
else:
|
|
print(o)
|
|
|
|
|
|
my_print(json.loads("null"))
|
|
my_print(json.loads("false"))
|
|
my_print(json.loads("true"))
|
|
my_print(json.loads("1"))
|
|
my_print(json.loads("-2"))
|
|
my_print(json.loads('"abc\\u0064e"'))
|
|
my_print(json.loads("[]"))
|
|
my_print(json.loads("[null]"))
|
|
my_print(json.loads("[null,false,true]"))
|
|
my_print(json.loads(" [ null , false , true ] "))
|
|
my_print(json.loads("{}"))
|
|
my_print(json.loads('{"a":true}'))
|
|
my_print(json.loads('{"a":null, "b":false, "c":true}'))
|
|
my_print(json.loads('{"a":[], "b":[1], "c":{"3":4}}'))
|
|
my_print(json.loads('"abc\\bdef"'))
|
|
my_print(json.loads('"abc\\fdef"'))
|
|
my_print(json.loads('"abc\\ndef"'))
|
|
my_print(json.loads('"abc\\rdef"'))
|
|
my_print(json.loads('"abc\\tdef"'))
|
|
my_print(json.loads('"abc\\uabcd"'))
|
|
|
|
# whitespace handling
|
|
my_print(json.loads('{\n\t"a":[]\r\n, "b":[1], "c":{"3":4} \n\r\t\r\r\r\n}'))
|
|
|
|
# loading nothing should raise exception
|
|
try:
|
|
json.loads("")
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# string which is not closed
|
|
try:
|
|
my_print(json.loads('"abc'))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# unaccompanied closing brace
|
|
try:
|
|
my_print(json.loads("]"))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# unspecified object type
|
|
try:
|
|
my_print(json.loads("a"))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# bad property name
|
|
try:
|
|
my_print(json.loads('{{}:"abc"}'))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# unexpected characters after white space
|
|
try:
|
|
my_print(json.loads("[null] a"))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# incomplete object declaration
|
|
try:
|
|
my_print(json.loads('{"a":0,'))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# incomplete nested array declaration
|
|
try:
|
|
my_print(json.loads('{"a":0, ['))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# incomplete array declaration
|
|
try:
|
|
my_print(json.loads('[0,'))
|
|
except ValueError:
|
|
print("ValueError")
|
|
|
|
# incomplete nested object declaration
|
|
try:
|
|
my_print(json.loads('[0, {"a":0, '))
|
|
except ValueError:
|
|
print("ValueError")
|