[Python-checkins] cpython: Issue #21650: Add an `--sort-keys` option to json.tool CLI.

berker.peksag python-checkins at python.org
Mon Nov 10 08:56:36 CET 2014


https://hg.python.org/cpython/rev/58a871227e5b
changeset:   93450:58a871227e5b
user:        Berker Peksag <berker.peksag at gmail.com>
date:        Mon Nov 10 09:56:54 2014 +0200
summary:
  Issue #21650: Add an `--sort-keys` option to json.tool CLI.

files:
  Doc/library/json.rst            |  11 ++++++
  Doc/whatsnew/3.5.rst            |   8 ++++
  Lib/json/tool.py                |  12 ++++++-
  Lib/test/test_json/test_tool.py |  35 +++++++++++++++++++-
  Misc/NEWS                       |   2 +
  5 files changed, 64 insertions(+), 4 deletions(-)


diff --git a/Doc/library/json.rst b/Doc/library/json.rst
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -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 --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst
--- a/Doc/whatsnew/3.5.rst
+++ b/Doc/whatsnew/3.5.rst
@@ -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 --git a/Lib/json/tool.py b/Lib/json/tool.py
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -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 --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
--- a/Lib/test/test_json/test_tool.py
+++ b/Lib/test/test_json/test_tool.py
@@ -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 --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list