12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- r"""Command-line tool to validate and pretty-print JSON
- Usage::
- $ echo '{"json":"obj"}' | python -m json.tool
- {
- "json": "obj"
- }
- $ echo '{ 1.2:3.4}' | python -m json.tool
- Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
- """
- import argparse
- import json
- import sys
- from pathlib import Path
- def main():
- prog = 'python -m json.tool'
- description = ('A simple command line interface for json module '
- 'to validate and pretty-print JSON objects.')
- parser = argparse.ArgumentParser(prog=prog, description=description)
- parser.add_argument('infile', nargs='?',
- type=argparse.FileType(encoding="utf-8"),
- help='a JSON file to be validated or pretty-printed',
- default=sys.stdin)
- parser.add_argument('outfile', nargs='?',
- type=Path,
- help='write the output of infile to outfile',
- default=None)
- parser.add_argument('--sort-keys', action='store_true', default=False,
- help='sort the output of dictionaries alphabetically by key')
- parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false',
- help='disable escaping of non-ASCII characters')
- parser.add_argument('--json-lines', action='store_true', default=False,
- help='parse input using the JSON Lines format. '
- 'Use with --no-indent or --compact to produce valid JSON Lines output.')
- group = parser.add_mutually_exclusive_group()
- group.add_argument('--indent', default=4, type=int,
- help='separate items with newlines and use this number '
- 'of spaces for indentation')
- group.add_argument('--tab', action='store_const', dest='indent',
- const='\t', help='separate items with newlines and use '
- 'tabs for indentation')
- group.add_argument('--no-indent', action='store_const', dest='indent',
- const=None,
- help='separate items with spaces rather than newlines')
- group.add_argument('--compact', action='store_true',
- help='suppress all whitespace separation (most compact)')
- options = parser.parse_args()
- dump_args = {
- 'sort_keys': options.sort_keys,
- 'indent': options.indent,
- 'ensure_ascii': options.ensure_ascii,
- }
- if options.compact:
- dump_args['indent'] = None
- dump_args['separators'] = ',', ':'
- with options.infile as infile:
- try:
- if options.json_lines:
- objs = (json.loads(line) for line in infile)
- else:
- objs = (json.load(infile),)
- if options.outfile is None:
- out = sys.stdout
- else:
- out = options.outfile.open('w', encoding='utf-8')
- with out as outfile:
- for obj in objs:
- json.dump(obj, outfile, **dump_args)
- outfile.write('\n')
- except ValueError as e:
- raise SystemExit(e)
- if __name__ == '__main__':
- try:
- main()
- except BrokenPipeError as exc:
- sys.exit(exc.errno)
|