[Python-checkins] bpo-31553: add --json-lines option to json.tool (#10051)

Serhiy Storchaka webhook-mailer at python.org
Wed Nov 7 05:09:37 EST 2018


https://github.com/python/cpython/commit/f19447994983902aa88362d8fffe645f1ea2f2aa
commit: f19447994983902aa88362d8fffe645f1ea2f2aa
branch: master
author: HongWeipeng <961365124 at qq.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2018年11月07日T12:09:32+02:00
summary:
bpo-31553: add --json-lines option to json.tool (#10051)
* add jsonlines option to json.tool
* code review
* fix:avoid read infile after it close
* improve doc in whatsnew 3.8
files:
A Misc/NEWS.d/next/Library/2018-10-23-14-46-47.bpo-31553.JxRkAW.rst
M Doc/library/json.rst
M Doc/whatsnew/3.8.rst
M Lib/json/tool.py
M Lib/test/test_json/test_tool.py
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index 510e30733fed..589e86ca8107 100644
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -717,6 +717,12 @@ Command line options
 
 .. versionadded:: 3.5
 
+.. cmdoption:: --json-lines
+
+ Parse every input line as separate JSON object.
+
+ .. versionadded:: 3.8
+
 .. cmdoption:: -h, --help
 
 Show the help message.
diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index 51aee1bed835..3bacbab1efb6 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -151,6 +151,12 @@ by right-clicking the button. (Contributed by Tal Einat in :issue:`1529353`.)
 The changes above have been backported to 3.7 maintenance releases.
 
 
+json.tool
+---------
+
+Add option ``--json-lines`` to parse every input line as separate JSON object.
+(Contributed by Weipeng Hong in :issue:`31553`.)
+
 os.path
 -------
 
diff --git a/Lib/json/tool.py b/Lib/json/tool.py
index 5932f4ecded7..1d82bc824236 100644
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -26,19 +26,25 @@ def main():
 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')
+ parser.add_argument('--json-lines', action='store_true', default=False,
+ help='parse input using the jsonlines format')
 options = parser.parse_args()
 
 infile = options.infile or sys.stdin
 outfile = options.outfile or sys.stdout
 sort_keys = options.sort_keys
- with infile:
+ json_lines = options.json_lines
+ with infile, outfile:
 try:
- obj = json.load(infile)
+ if json_lines:
+ objs = (json.loads(line) for line in infile)
+ else:
+ objs = (json.load(infile), )
+ for obj in objs:
+ json.dump(obj, outfile, sort_keys=sort_keys, indent=4)
+ outfile.write('\n')
 except ValueError as e:
 raise SystemExit(e)
- with outfile:
- json.dump(obj, outfile, sort_keys=sort_keys, indent=4)
- outfile.write('\n')
 
 
 if __name__ == '__main__':
diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
index 9d93f931ca39..1e95bc79e5d1 100644
--- a/Lib/test/test_json/test_tool.py
+++ b/Lib/test/test_json/test_tool.py
@@ -60,6 +60,28 @@ class TestTool(unittest.TestCase):
 ]
 """)
 
+ jsonlines_raw = textwrap.dedent("""\
+ {"ingredients":["frog", "water", "chocolate", "glucose"]}
+ {"ingredients":["chocolate","steel bolts"]}
+ """)
+
+ jsonlines_expect = textwrap.dedent("""\
+ {
+ "ingredients": [
+ "frog",
+ "water",
+ "chocolate",
+ "glucose"
+ ]
+ }
+ {
+ "ingredients": [
+ "chocolate",
+ "steel bolts"
+ ]
+ }
+ """)
+
 def test_stdin_stdout(self):
 args = sys.executable, '-m', 'json.tool'
 with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
@@ -92,6 +114,13 @@ def test_infile_outfile(self):
 self.assertEqual(out, b'')
 self.assertEqual(err, b'')
 
+ def test_jsonlines(self):
+ args = sys.executable, '-m', 'json.tool', '--json-lines'
+ with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
+ out, err = proc.communicate(self.jsonlines_raw.encode())
+ self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines())
+ self.assertEqual(err, b'')
+
 def test_help_flag(self):
 rc, out, err = assert_python_ok('-m', 'json.tool', '-h')
 self.assertEqual(rc, 0)
diff --git a/Misc/NEWS.d/next/Library/2018-10-23-14-46-47.bpo-31553.JxRkAW.rst b/Misc/NEWS.d/next/Library/2018-10-23-14-46-47.bpo-31553.JxRkAW.rst
new file mode 100644
index 000000000000..de80e7cd7d11
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-10-23-14-46-47.bpo-31553.JxRkAW.rst
@@ -0,0 +1 @@
+Add the --json-lines option to json.tool. Patch by hongweipeng.
\ No newline at end of file


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /