circuitpython/tests/extmod/json_loads.py
Alessandro Gatti 9ef16b466b extmod/modjson: Detect unterminated composite entities.
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>
2025-05-19 02:09:40 +02:00

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")