Commit a7d64a6f authored by Ezio Melotti's avatar Ezio Melotti

#17368: Fix an off-by-one error in the Python JSON decoder that caused a...

#17368: Fix an off-by-one error in the Python JSON decoder that caused a failure while decoding empty object literals when object_pairs_hook was specified.
parent 7343cb07
...@@ -167,7 +167,7 @@ def JSONObject(s_and_end, strict, scan_once, object_hook, object_pairs_hook, ...@@ -167,7 +167,7 @@ def JSONObject(s_and_end, strict, scan_once, object_hook, object_pairs_hook,
if nextchar == '}': if nextchar == '}':
if object_pairs_hook is not None: if object_pairs_hook is not None:
result = object_pairs_hook(pairs) result = object_pairs_hook(pairs)
return result, end return result, end + 1
pairs = {} pairs = {}
if object_hook is not None: if object_hook is not None:
pairs = object_hook(pairs) pairs = object_hook(pairs)
......
...@@ -25,16 +25,22 @@ class TestDecode: ...@@ -25,16 +25,22 @@ class TestDecode:
p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4), p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4),
("qrt", 5), ("pad", 6), ("hoy", 7)] ("qrt", 5), ("pad", 6), ("hoy", 7)]
self.assertEqual(self.loads(s), eval(s)) self.assertEqual(self.loads(s), eval(s))
self.assertEqual(self.loads(s, object_pairs_hook = lambda x: x), p) self.assertEqual(self.loads(s, object_pairs_hook=lambda x: x), p)
self.assertEqual(self.json.load(StringIO(s), self.assertEqual(self.json.load(StringIO(s),
object_pairs_hook=lambda x: x), p) object_pairs_hook=lambda x: x), p)
od = self.loads(s, object_pairs_hook = OrderedDict) od = self.loads(s, object_pairs_hook=OrderedDict)
self.assertEqual(od, OrderedDict(p)) self.assertEqual(od, OrderedDict(p))
self.assertEqual(type(od), OrderedDict) self.assertEqual(type(od), OrderedDict)
# the object_pairs_hook takes priority over the object_hook # the object_pairs_hook takes priority over the object_hook
self.assertEqual(self.loads(s, object_pairs_hook = OrderedDict, self.assertEqual(self.loads(s, object_pairs_hook=OrderedDict,
object_hook = lambda x: None), object_hook=lambda x: None),
OrderedDict(p)) OrderedDict(p))
# check that empty objects literals work (see #17368)
self.assertEqual(self.loads('{}', object_pairs_hook=OrderedDict),
OrderedDict())
self.assertEqual(self.loads('{"empty": {}}',
object_pairs_hook=OrderedDict),
OrderedDict([('empty', OrderedDict())]))
def test_decoder_optimizations(self): def test_decoder_optimizations(self):
# Several optimizations were made that skip over calls to # Several optimizations were made that skip over calls to
......
...@@ -233,6 +233,10 @@ Core and Builtins ...@@ -233,6 +233,10 @@ Core and Builtins
Library Library
------- -------
- Issue #17368: Fix an off-by-one error in the Python JSON decoder that caused
a failure while decoding empty object literals when object_pairs_hook was
specified.
- Issue #14645: The email generator classes now produce output using the - Issue #14645: The email generator classes now produce output using the
specified linesep throughout. Previously if the prolog, epilog, or specified linesep throughout. Previously if the prolog, epilog, or
body were stored with a different linesep, that linesep was used. This body were stored with a different linesep, that linesep was used. This
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment