changeset: 93450:58a871227e5b user: Berker Peksag date: Mon Nov 10 09:56:54 2014 +0200 files: Doc/library/json.rst Doc/whatsnew/3.5.rst Lib/json/tool.py Lib/test/test_json/test_tool.py Misc/NEWS description: Issue #21650: Add an `--sort-keys` option to json.tool CLI. diff -r 147fda13bec8 -r 58a871227e5b Doc/library/json.rst --- a/Doc/library/json.rst Sun Nov 09 22:30:36 2014 -0800 +++ b/Doc/library/json.rst Mon Nov 10 09:56:54 2014 +0200 @@ -567,6 +567,7 @@ The *object_pairs_hook* parameter can be used to alter this behavior. .. highlight:: bash +.. module:: json.tool .. _json-commandline: @@ -586,6 +587,10 @@ $ echo '{1.2:3.4}' | python -m json.tool 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 ^^^^^^^^^^^^^^^^^^^^ @@ -613,6 +618,12 @@ Write the output of the *infile* to the given *outfile*. Otherwise, write it to :attr:`sys.stdout`. +.. cmdoption:: --sort-keys + + Sort the output of dictionaries alphabetically by key. + + .. versionadded:: 3.5 + .. cmdoption:: -h, --help Show the help message. diff -r 147fda13bec8 -r 58a871227e5b Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst Sun Nov 09 22:30:36 2014 -0800 +++ b/Doc/whatsnew/3.5.rst Mon Nov 10 09:56:54 2014 +0200 @@ -211,6 +211,14 @@ network objects from existing addresses. (Contributed by Peter Moody 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 -- diff -r 147fda13bec8 -r 58a871227e5b Lib/json/tool.py --- a/Lib/json/tool.py Sun Nov 09 22:30:36 2014 -0800 +++ b/Lib/json/tool.py Mon Nov 10 09:56:54 2014 +0200 @@ -11,6 +11,7 @@ """ import argparse +import collections import json import sys @@ -24,17 +25,24 @@ help='a JSON file to be validated or pretty-printed') parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), 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() infile = options.infile or sys.stdin outfile = options.outfile or sys.stdout + sort_keys = options.sort_keys with infile: 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: raise SystemExit(e) with outfile: - json.dump(obj, outfile, sort_keys=True, indent=4) + json.dump(obj, outfile, sort_keys=sort_keys, indent=4) outfile.write('\n') diff -r 147fda13bec8 -r 58a871227e5b Lib/test/test_json/test_tool.py --- a/Lib/test/test_json/test_tool.py Sun Nov 09 22:30:36 2014 -0800 +++ b/Lib/test/test_json/test_tool.py Mon Nov 10 09:56:54 2014 +0200 @@ -6,6 +6,7 @@ from test import support from test.script_helper import assert_python_ok + class TestTool(unittest.TestCase): data = """ @@ -15,6 +16,28 @@ :"yes"} ] """ + expect_without_sort_keys = textwrap.dedent("""\ + [ + [ + "blorpie" + ], + [ + "whoops" + ], + [], + "d-shtaeou", + "d-nthiouh", + "i-vhbjkhnth", + { + "nifty": 87 + }, + { + "field": "yes", + "morefield": false + } + ] + """) + expect = textwrap.dedent("""\ [ [ @@ -31,8 +54,8 @@ "nifty": 87 }, { - "field": "yes", - "morefield": false + "morefield": false, + "field": "yes" } ] """) @@ -75,3 +98,11 @@ self.assertEqual(rc, 0) self.assertTrue(out.startswith(b'usage: ')) 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'') diff -r 147fda13bec8 -r 58a871227e5b Misc/NEWS --- a/Misc/NEWS Sun Nov 09 22:30:36 2014 -0800 +++ b/Misc/NEWS Mon Nov 10 09:56:54 2014 +0200 @@ -183,6 +183,8 @@ Library ------- +- Issue #21650: Add an `--sort-keys` option to json.tool CLI. + - Issues #814253, #9179: Group references and conditional group references now work in lookbehind assertions in regular expressions.