]> granicus.if.org Git - python/commitdiff
#17368: Fix an off-by-one error in the Python JSON decoder that caused a failure...
authorEzio Melotti <ezio.melotti@gmail.com>
Tue, 12 Mar 2013 23:52:34 +0000 (01:52 +0200)
committerEzio Melotti <ezio.melotti@gmail.com>
Tue, 12 Mar 2013 23:52:34 +0000 (01:52 +0200)
Lib/json/decoder.py
Lib/test/json_tests/test_decode.py
Misc/NEWS

index 0c59edd6baace234050f4e20612f1b11356be019..938ebffb11a09417e1e06f802f2ea320a907f942 100644 (file)
@@ -167,7 +167,7 @@ def JSONObject(s_and_end, strict, scan_once, object_hook, object_pairs_hook,
         if nextchar == '}':
             if object_pairs_hook is not None:
                 result = object_pairs_hook(pairs)
-                return result, end
+                return result, end + 1
             pairs = {}
             if object_hook is not None:
                 pairs = object_hook(pairs)
index 0a55a33f1eae36ad0806537afc5c16e8e46947c1..15a427f719b29f88e83b6ee7d971c2b297063f16 100644 (file)
@@ -25,16 +25,22 @@ class TestDecode:
         p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4),
              ("qrt", 5), ("pad", 6), ("hoy", 7)]
         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),
                                         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(type(od), OrderedDict)
         # the object_pairs_hook takes priority over the object_hook
-        self.assertEqual(self.loads(s, object_pairs_hook = OrderedDict,
-                                    object_hook = lambda x: None),
+        self.assertEqual(self.loads(s, object_pairs_hook=OrderedDict,
+                                    object_hook=lambda x: None),
                          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):
         # Several optimizations were made that skip over calls to
index c4da80024e25e082eb5486a7e32cf215a2f30168..9b4aa52137f6d63f3629ec29c60b889ef96f2379 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -233,6 +233,10 @@ Core and Builtins
 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
   specified linesep throughout.  Previously if the prolog, epilog, or
   body were stored with a different linesep, that linesep was used.  This