Skip to content

Instantly share code, notes, and snippets.

@kristovatlas
Created November 26, 2025 22:29
Show Gist options
  • Select an option

  • Save kristovatlas/824d0d74ac169cfd7b8810bb27143324 to your computer and use it in GitHub Desktop.

Select an option

Save kristovatlas/824d0d74ac169cfd7b8810bb27143324 to your computer and use it in GitHub Desktop.
Prettify JSON-y looking things locally
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