mirror of
https://github.com/python/cpython.git
synced 2025-07-07 11:25:30 +00:00
gh-131884: Fix incorrect formatting in json.dumps() when using indent and skipkeys=True (GH-132200)
This commit is contained in:
parent
485b499610
commit
ec12559eba
4 changed files with 20 additions and 7 deletions
|
@ -348,7 +348,6 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
_current_indent_level += 1
|
||||
newline_indent = '\n' + _indent * _current_indent_level
|
||||
item_separator = _item_separator + newline_indent
|
||||
yield newline_indent
|
||||
else:
|
||||
newline_indent = None
|
||||
item_separator = _item_separator
|
||||
|
@ -381,6 +380,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
f'not {key.__class__.__name__}')
|
||||
if first:
|
||||
first = False
|
||||
if newline_indent is not None:
|
||||
yield newline_indent
|
||||
else:
|
||||
yield item_separator
|
||||
yield _encoder(key)
|
||||
|
@ -413,7 +414,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
except BaseException as exc:
|
||||
exc.add_note(f'when serializing {type(dct).__name__} item {key!r}')
|
||||
raise
|
||||
if newline_indent is not None:
|
||||
if not first and newline_indent is not None:
|
||||
_current_indent_level -= 1
|
||||
yield '\n' + _indent * _current_indent_level
|
||||
yield '}'
|
||||
|
|
|
@ -22,6 +22,14 @@ class TestDump:
|
|||
self.assertIn('valid_key', o)
|
||||
self.assertNotIn(b'invalid_key', o)
|
||||
|
||||
def test_dump_skipkeys_indent_empty(self):
|
||||
v = {b'invalid_key': False}
|
||||
self.assertEqual(self.json.dumps(v, skipkeys=True, indent=4), '{}')
|
||||
|
||||
def test_skipkeys_indent(self):
|
||||
v = {b'invalid_key': False, 'valid_key': True}
|
||||
self.assertEqual(self.json.dumps(v, skipkeys=True, indent=4), '{\n "valid_key": true\n}')
|
||||
|
||||
def test_encode_truefalse(self):
|
||||
self.assertEqual(self.dumps(
|
||||
{True: False, False: True}, sort_keys=True),
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix formatting issues in :func:`json.dump` when both *indent* and *skipkeys* are used.
|
|
@ -1603,6 +1603,12 @@ encoder_encode_key_value(PyEncoderObject *s, PyUnicodeWriter *writer, bool *firs
|
|||
|
||||
if (*first) {
|
||||
*first = false;
|
||||
if (s->indent != Py_None) {
|
||||
if (write_newline_indent(writer, indent_level, indent_cache) < 0) {
|
||||
Py_DECREF(keystr);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (PyUnicodeWriter_WriteStr(writer, item_separator) < 0) {
|
||||
|
@ -1670,11 +1676,8 @@ encoder_listencode_dict(PyEncoderObject *s, PyUnicodeWriter *writer,
|
|||
if (s->indent != Py_None) {
|
||||
indent_level++;
|
||||
separator = get_item_separator(s, indent_level, indent_cache);
|
||||
if (separator == NULL ||
|
||||
write_newline_indent(writer, indent_level, indent_cache) < 0)
|
||||
{
|
||||
if (separator == NULL)
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
|
||||
if (s->sort_keys || !PyDict_CheckExact(dct)) {
|
||||
|
@ -1714,7 +1717,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyUnicodeWriter *writer,
|
|||
goto bail;
|
||||
Py_CLEAR(ident);
|
||||
}
|
||||
if (s->indent != Py_None) {
|
||||
if (s->indent != Py_None && !first) {
|
||||
indent_level--;
|
||||
if (write_newline_indent(writer, indent_level, indent_cache) < 0) {
|
||||
goto bail;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue