https://github.com/python/cpython/commit/adf836ebddd89793afb6d43a79d0a0739ee5514b
commit: adf836ebddd89793afb6d43a79d0a0739ee5514b
branch: main
author: yangbaechu <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-07-31T11:57:00+03:00
summary:
gh-154936: Fix JSON control character error position (GH-154941)
Report the index of the invalid literal control character instead of
the following index in the pure Python decoder.
files:
A Misc/NEWS.d/next/Library/2026-07-30-23-29-56.gh-issue-154936.a90443.rst
M Lib/json/decoder.py
M Lib/test/test_json/test_unicode.py
diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py
index 364e44d40cc3073..3150a29405f75c3 100644
--- a/Lib/json/decoder.py
+++ b/Lib/json/decoder.py
@@ -97,7 +97,7 @@ def py_scanstring(s, end, strict=True,
if strict:
#msg = "Invalid control character %r at" % (terminator,)
msg = "Invalid control character {0!r} at".format(terminator)
- raise JSONDecodeError(msg, s, end)
+ raise JSONDecodeError(msg, s, end - 1)
else:
_append(terminator)
continue
diff --git a/Lib/test/test_json/test_unicode.py
b/Lib/test/test_json/test_unicode.py
index 1aa9546dc463061..291580cb047be46 100644
--- a/Lib/test/test_json/test_unicode.py
+++ b/Lib/test/test_json/test_unicode.py
@@ -44,7 +44,13 @@ def test_ascii_non_printable_decode(self):
'\b\t\n\f\r')
s = ''.join(map(chr, range(32)))
for c in s:
- self.assertRaises(self.JSONDecodeError, self.loads, f'"{c}"')
+ with self.subTest(control_character=ord(c)):
+ with self.assertRaises(self.JSONDecodeError) as cm:
+ self.loads(f'"a{c}b"')
+ error = cm.exception
+ self.assertEqual(error.pos, 2)
+ self.assertEqual(error.lineno, 1)
+ self.assertEqual(error.colno, 3)
self.assertEqual(self.loads(f'"{s}"', strict=False), s)
self.assertEqual(self.loads('"\x7f"'), '\x7f')
diff --git
a/Misc/NEWS.d/next/Library/2026-07-30-23-29-56.gh-issue-154936.a90443.rst
b/Misc/NEWS.d/next/Library/2026-07-30-23-29-56.gh-issue-154936.a90443.rst
new file mode 100644
index 000000000000000..19660c406eb2d0f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-07-30-23-29-56.gh-issue-154936.a90443.rst
@@ -0,0 +1,2 @@
+Fix the pure Python :mod:`json` decoder to report the correct position for
+invalid literal control characters in JSON strings.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]