Issue #21650: Add an `--sort-keys` option to json.tool CLI.

This commit is contained in:
Berker Peksag 2014-11-10 09:56:54 +02:00
parent ffd842e1d6
commit 39e4c4d873
5 changed files with 63 additions and 3 deletions

View File

@ -567,6 +567,7 @@ the last name-value pair for a given name::
The *object_pairs_hook* parameter can be used to alter this behavior. The *object_pairs_hook* parameter can be used to alter this behavior.
.. highlight:: bash .. highlight:: bash
.. module:: json.tool
.. _json-commandline: .. _json-commandline:
@ -586,6 +587,10 @@ specified, :attr:`sys.stdin` and :attr:`sys.stdout` will be used respectively::
$ echo '{1.2:3.4}' | python -m json.tool $ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1) Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
.. versionchanged:: 3.5
The output is now in the same order as the input. Use the
:option:`--sort-keys` option to sort the output of dictionaries
alphabetically by key.
Command line options Command line options
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
@ -613,6 +618,12 @@ Command line options
Write the output of the *infile* to the given *outfile*. Otherwise, write it Write the output of the *infile* to the given *outfile*. Otherwise, write it
to :attr:`sys.stdout`. to :attr:`sys.stdout`.
.. cmdoption:: --sort-keys
Sort the output of dictionaries alphabetically by key.
.. versionadded:: 3.5
.. cmdoption:: -h, --help .. cmdoption:: -h, --help
Show the help message. Show the help message.

View File

@ -211,6 +211,14 @@ ipaddress
network objects from existing addresses. (Contributed by Peter Moody network objects from existing addresses. (Contributed by Peter Moody
and Antoine Pitrou in :issue:`16531`.) and Antoine Pitrou in :issue:`16531`.)
json
----
* The output of :mod:`json.tool` command line interface is now in the same
order as the input. Use the :option:`--sort-keys` option to sort the output
of dictionaries alphabetically by key. (Contributed by Berker Peksag in
:issue:`21650`.)
os os
-- --

View File

@ -11,6 +11,7 @@ Usage::
""" """
import argparse import argparse
import collections
import json import json
import sys import sys
@ -24,17 +25,24 @@ def main():
help='a JSON file to be validated or pretty-printed') help='a JSON file to be validated or pretty-printed')
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
help='write the output of infile to outfile') help='write the output of infile to outfile')
parser.add_argument('--sort-keys', action='store_true', default=False,
help='sort the output of dictionaries alphabetically by key')
options = parser.parse_args() options = parser.parse_args()
infile = options.infile or sys.stdin infile = options.infile or sys.stdin
outfile = options.outfile or sys.stdout outfile = options.outfile or sys.stdout
sort_keys = options.sort_keys
with infile: with infile:
try: try:
obj = json.load(infile) if sort_keys:
obj = json.load(infile)
else:
obj = json.load(infile,
object_pairs_hook=collections.OrderedDict)
except ValueError as e: except ValueError as e:
raise SystemExit(e) raise SystemExit(e)
with outfile: with outfile:
json.dump(obj, outfile, sort_keys=True, indent=4) json.dump(obj, outfile, sort_keys=sort_keys, indent=4)
outfile.write('\n') outfile.write('\n')

View File

@ -6,6 +6,7 @@ import subprocess
from test import support from test import support
from test.script_helper import assert_python_ok from test.script_helper import assert_python_ok
class TestTool(unittest.TestCase): class TestTool(unittest.TestCase):
data = """ data = """
@ -15,7 +16,7 @@ class TestTool(unittest.TestCase):
:"yes"} ] :"yes"} ]
""" """
expect = textwrap.dedent("""\ expect_without_sort_keys = textwrap.dedent("""\
[ [
[ [
"blorpie" "blorpie"
@ -37,6 +38,28 @@ class TestTool(unittest.TestCase):
] ]
""") """)
expect = textwrap.dedent("""\
[
[
"blorpie"
],
[
"whoops"
],
[],
"d-shtaeou",
"d-nthiouh",
"i-vhbjkhnth",
{
"nifty": 87
},
{
"morefield": false,
"field": "yes"
}
]
""")
def test_stdin_stdout(self): def test_stdin_stdout(self):
with subprocess.Popen( with subprocess.Popen(
(sys.executable, '-m', 'json.tool'), (sys.executable, '-m', 'json.tool'),
@ -75,3 +98,11 @@ class TestTool(unittest.TestCase):
self.assertEqual(rc, 0) self.assertEqual(rc, 0)
self.assertTrue(out.startswith(b'usage: ')) self.assertTrue(out.startswith(b'usage: '))
self.assertEqual(err, b'') self.assertEqual(err, b'')
def test_sort_keys_flag(self):
infile = self._create_infile()
rc, out, err = assert_python_ok('-m', 'json.tool', '--sort-keys', infile)
self.assertEqual(rc, 0)
self.assertEqual(out.splitlines(),
self.expect_without_sort_keys.encode().splitlines())
self.assertEqual(err, b'')

View File

@ -183,6 +183,8 @@ Core and Builtins
Library Library
------- -------
- Issue #21650: Add an `--sort-keys` option to json.tool CLI.
- Issues #814253, #9179: Group references and conditional group references now - Issues #814253, #9179: Group references and conditional group references now
work in lookbehind assertions in regular expressions. work in lookbehind assertions in regular expressions.