Skip to content

Commit a1b491d

Browse files
committed
Fix JSON encoder to handle indentation with skipkeys option in dumps
1 parent ce49022 commit a1b491d

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

Lib/json/encoder.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@ def _iterencode_dict(dct, _current_indent_level):
348348
_current_indent_level += 1
349349
newline_indent = '\n' + _indent * _current_indent_level
350350
item_separator = _item_separator + newline_indent
351-
yield newline_indent
352351
else:
353352
newline_indent = None
354353
item_separator = _item_separator
@@ -381,6 +380,8 @@ def _iterencode_dict(dct, _current_indent_level):
381380
f'not {key.__class__.__name__}')
382381
if first:
383382
first = False
383+
if newline_indent is not None:
384+
yield newline_indent
384385
else:
385386
yield item_separator
386387
yield _encoder(key)
@@ -413,7 +414,7 @@ def _iterencode_dict(dct, _current_indent_level):
413414
except BaseException as exc:
414415
exc.add_note(f'when serializing {type(dct).__name__} item {key!r}')
415416
raise
416-
if newline_indent is not None:
417+
if not first and newline_indent is not None:
417418
_current_indent_level -= 1
418419
yield '\n' + _indent * _current_indent_level
419420
yield '}'

Modules/_json.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,6 +1616,12 @@ encoder_encode_key_value(PyEncoderObject *s, PyUnicodeWriter *writer, bool *firs
16161616

16171617
if (*first) {
16181618
*first = false;
1619+
if (s->indent != Py_None) {
1620+
if (write_newline_indent(writer, indent_level, indent_cache) < 0) {
1621+
Py_DECREF(keystr);
1622+
return -1;
1623+
}
1624+
}
16191625
}
16201626
else {
16211627
if (PyUnicodeWriter_WriteStr(writer, item_separator) < 0) {
@@ -1683,11 +1689,8 @@ encoder_listencode_dict(PyEncoderObject *s, PyUnicodeWriter *writer,
16831689
if (s->indent != Py_None) {
16841690
indent_level++;
16851691
separator = get_item_separator(s, indent_level, indent_cache);
1686-
if (separator == NULL ||
1687-
write_newline_indent(writer, indent_level, indent_cache) < 0)
1688-
{
1692+
if (separator == NULL)
16891693
goto bail;
1690-
}
16911694
}
16921695

16931696
if (s->sort_keys || !PyDict_CheckExact(dct)) {
@@ -1727,7 +1730,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyUnicodeWriter *writer,
17271730
goto bail;
17281731
Py_CLEAR(ident);
17291732
}
1730-
if (s->indent != Py_None) {
1733+
if (s->indent != Py_None && !first) {
17311734
indent_level--;
17321735
if (write_newline_indent(writer, indent_level, indent_cache) < 0) {
17331736
goto bail;

0 commit comments

Comments
 (0)