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 prettyprint json objects parser argparse argumentparserprogprog descriptiondescription parser addargument infile nargs typeargparse filetypeencodingutf8 help a json file to be validated or prettyprinted defaultsys stdin parser addargument outfile nargs typepath help write the output of infile to outfile defaultnone parser addargument sortkeys action storetrue defaultfalse help sort the output of dictionaries alphabetically by key parser addargument noensureascii dest ensureascii action storefalse help disable escaping of nonascii characters parser addargument jsonlines action storetrue defaultfalse help parse input using the json lines format use with noindent or compact to produce valid json lines output group parser addmutuallyexclusivegroup group addargument indent default4 typeint help separate items with newlines and use this number of spaces for indentation group addargument tab action storeconst dest indent const t help separate items with newlines and use tabs for indentation group addargument noindent action storeconst dest indent constnone help separate items with spaces rather than newlines group addargument compact action storetrue help suppress all whitespace separation most compact options parser parseargs dumpargs sortkeys options sortkeys indent options indent ensureascii options ensureascii if options compact dumpargs indent none dumpargs separators with options infile as infile try if options jsonlines objs json loadsline for line in infile else objs json loadinfile if options outfile is none out sys stdout else out options outfile open w encoding utf8 with out as outfile for obj in objs json dumpobj outfile dumpargs outfile write n except valueerror as e raise systemexite if name main try main except brokenpipeerror as exc sys exitexc errno 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
r
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)