Created
November 26, 2025 22:29
-
-
Save kristovatlas/824d0d74ac169cfd7b8810bb27143324 to your computer and use it in GitHub Desktop.
Prettify JSON-y looking things locally
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import ast | |
| import json | |
| import sys | |
| def parse_nested_json(obj): | |
| """Recursively parse any string values that are valid JSON into objects.""" | |
| if isinstance(obj, dict): | |
| return {k: parse_nested_json(v) for k, v in obj.items()} | |
| elif isinstance(obj, list): | |
| return [parse_nested_json(i) for i in obj] | |
| elif isinstance(obj, str): | |
| try: | |
| parsed = json.loads(obj) | |
| return parse_nested_json(parsed) # Recurse if nested | |
| except json.JSONDecodeError: | |
| return obj # Not JSON, leave as string | |
| else: | |
| return obj | |
| def parse_relaxed_json(input_path, output_path=None, indent=4, sort_keys=False): | |
| try: | |
| with open(input_path, 'r') as f: | |
| data_str = f.read() | |
| data = ast.literal_eval(data_str) # Parses with single quotes allowed | |
| # Recursively parse nested JSON strings | |
| expanded_data = parse_nested_json(data) | |
| pretty_json = json.dumps(expanded_data, indent=indent, sort_keys=sort_keys) | |
| if output_path: | |
| with open(output_path, 'w') as f: | |
| f.write(pretty_json) | |
| print(f"Prettified JSON saved to {output_path}") | |
| else: | |
| print(pretty_json) | |
| except SyntaxError as e: | |
| print(f"Error: Invalid syntax for literal eval - {e}") | |
| except ValueError as e: | |
| print(f"Error: Malformed data - {e}") | |
| except FileNotFoundError: | |
| print(f"Error: File '{input_path}' not found") | |
| if __name__ == "__main__": | |
| if len(sys.argv) < 2: | |
| print("Usage: python parse_relaxed_json.py input.json [output.json]") | |
| sys.exit(1) | |
| input_path = sys.argv[1] | |
| output_path = sys.argv[2] if len(sys.argv) > 2 else None | |
| parse_relaxed_json(input_path, output_path) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment