#!/usr/bin/env python3 import argparse import json import sys from typing import Any, Sequence def pretty_json(text: str, indent: int = 2) -> str: """Parse JSON text and return a consistently formatted representation.""" value: Any = json.loads(text) return json.dumps(value, indent=indent, ensure_ascii=False, sort_keys=True) def _test() -> None: assert pretty_json('{"b":1,"a":[true,null]}') == ( '{\n' ' "a": [\n' ' true,\n' ' null\n' ' ],\n' ' "b": 1\n' '}' ) assert pretty_json('{"message":"café"}', indent=4) == ( '{\n' ' "message": "café"\n' '}' ) def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Pretty-print JSON.") parser.add_argument("file", nargs="?", help="JSON file; defaults to standard input") parser.add_argument("-i", "--indent", type=int, default=2) parser.add_argument("--test", action="store_true", help="run built-in tests") args = parser.parse_args(argv) if args.test: _test() return 0 # Read a file when supplied, otherwise support shell pipelines. try: if args.file: with open(args.file, encoding="utf-8") as source: text = source.read() else: text = sys.stdin.read() print(pretty_json(text, args.indent)) return 0 except (OSError, json.JSONDecodeError, ValueError) as error: print(f"error: {error}", file=sys.stderr) return 1 if __name__ == "__main__": raise SystemExit(main())