From 3dd02d62c90a169a32fb38bed34249a6cf7e1638 Mon Sep 17 00:00:00 2001 From: R David Murray Date: Tue, 12 Apr 2011 21:02:45 -0400 Subject: [PATCH] #10019: Fix regression relative to 2.6: add newlines if indent=0 Patch by Amaury Forgeot d'Arc, updated by Sando Tosi. --- Doc/library/json.rst | 6 +++--- Lib/json/encoder.py | 2 +- Lib/json/tests/test_indent.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 1e8a87b09c3..2bf242fff42 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -135,9 +135,9 @@ Basic Usage using the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). If *indent* is a non-negative integer, then JSON array elements and object - members will be pretty-printed with that indent level. An indent level of 0 - will only insert newlines. ``None`` (the default) selects the most compact - representation. + members will be pretty-printed with that indent level. An indent level of 0, + or negative, will only insert newlines. ``None`` (the default) selects the + most compact representation. If *separators* is an ``(item_separator, dict_separator)`` tuple, then it will be used instead of the default ``(', ', ': ')`` separators. ``(',', diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 13359856d29..accbde0bd54 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -233,7 +233,7 @@ class JSONEncoder(object): if (_one_shot and c_make_encoder is not None - and not self.indent): + and self.indent is None): _iterencode = c_make_encoder( markers, self.default, _encoder, self.indent, self.key_separator, self.item_separator, self.sort_keys, diff --git a/Lib/json/tests/test_indent.py b/Lib/json/tests/test_indent.py index cd608d94a57..d45aa851bd7 100644 --- a/Lib/json/tests/test_indent.py +++ b/Lib/json/tests/test_indent.py @@ -2,6 +2,7 @@ from unittest import TestCase import json import textwrap +from io import StringIO class TestIndent(TestCase): def test_indent(self): @@ -39,3 +40,18 @@ class TestIndent(TestCase): self.assertEqual(h1, h) self.assertEqual(h2, h) self.assertEqual(d2, expect) + + def test_indent0(self): + h = {3: 1} + def check(indent, expected): + d1 = json.dumps(h, indent=indent) + self.assertEqual(d1, expected) + + sio = StringIO() + json.dump(h, sio, indent=indent) + self.assertEqual(sio.getvalue(), expected) + + # indent=0 should emit newlines + check(0, '{\n"3": 1\n}') + # indent=None is more compact + check(None, '{"3": 1}') diff --git a/Misc/NEWS b/Misc/NEWS index b80bd5268ad..af8fb292c83 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -51,6 +51,9 @@ Core and Builtins Library ------- +- Issue #10019: Fixed regression in json module where an indent of 0 stopped + adding newlines and acted instead like 'None'. + - Issue #5162: Treat services like frozen executables to allow child spawning from multiprocessing.forking on Windows.