Back to Tools

JSON Formatter & Validator

Format, validate, and minify JSON. Perfect for debugging configs, API responses, and IaC files.

Valid JSON

What is JSON?

JSON (JavaScript Object Notation) is a lightweight data-interchange format that's easy for humans to read and write, and easy for machines to parse and generate. JSON is language-independent and is widely used for data exchange in web applications, APIs, and configuration files.

Why JSON Formatting Matters

  • Readability: Properly formatted JSON is easier to read and debug
  • Maintainability: Well-formatted JSON is easier to maintain and modify
  • Error detection: Formatting helps identify syntax errors
  • Version control: Consistent formatting improves diff readability
  • API documentation: Formatted JSON is essential for API docs
  • Configuration files: Infrastructure as Code (IaC) files benefit from formatting

JSON Syntax Basics

Basic Structure

JSON supports two main data structures:

Objects (key-value pairs):

{
  "key": "value",
  "number": 42,
  "boolean": true
}

Arrays (ordered lists):

[
  "item1",
  "item2",
  "item3"
]

Data Types

JSON supports these data types:

TypeExampleNotes
String"hello"Must be in double quotes
Number42, 3.14, -10No leading zeros, no NaN/Infinity
Booleantrue, falseLowercase only
NullnullLowercase only
Object{"key": "value"}Unordered key-value pairs
Array[1, 2, 3]Ordered list of values

Syntax Rules

  1. Keys must be strings: Always in double quotes
  2. No trailing commas: Last item in object/array cannot have a comma
  3. No comments: JSON does not support comments
  4. Double quotes only: Single quotes are not valid
  5. No functions: JSON cannot represent functions or undefined

JSON Formatting

Indentation

Indentation makes JSON readable by showing the hierarchy:

No indentation (minified):

{"name":"John","age":30,"city":"New York","hobbies":["reading","coding"],"address":{"street":"123 Main St","zip":"10001"}}

2-space indentation (common):

{
  "name": "John",
  "age": 30,
  "city": "New York",
  "hobbies": [
    "reading",
    "coding"
  ],
  "address": {
    "street": "123 Main St",
    "zip": "10001"
  }
}

4-space indentation:

{
    "name": "John",
    "age": 30,
    "city": "New York",
    "hobbies": [
        "reading",
        "coding"
    ],
    "address": {
        "street": "123 Main St",
        "zip": "10001"
    }
}

Common Indentation Styles

2 spaces (most common):

  • Used by: npm, many JavaScript projects
  • Good balance between readability and file size

4 spaces:

  • Used by: Some Python projects, older JavaScript projects
  • More visual separation

Tabs:

  • Less common in JSON
  • Can cause issues with different tab sizes

No indentation (minified):

  • Used for: Production APIs, reducing file size
  • Not human-readable but efficient

JSON Minification

What is Minification?

Minification removes all unnecessary whitespace from JSON to reduce file size:

Before (formatted):

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

After (minified):

{"name":"John","age":30,"city":"New York"}

When to Minify

Minify for:

  • Production APIs (reduces bandwidth)
  • Large JSON files (saves storage)
  • Network transmission (faster transfer)
  • Embedded JSON in HTML/JavaScript

Don't minify for:

  • Configuration files (readability matters)
  • Development/debugging (need readability)
  • Documentation (must be readable)
  • Version control (better diffs when formatted)

Size Comparison

Example:

  • Formatted: 1,234 characters
  • Minified: 856 characters
  • Savings: ~30% reduction

For large JSON files, minification can significantly reduce size.

JSON Validation

Common JSON Errors

1. Trailing Comma

Error:

{
  "name": "John",
  "age": 30,  // ❌ Trailing comma
}

Fixed:

{
  "name": "John",
  "age": 30   // ✅ No trailing comma
}

2. Single Quotes

Error:

{
  'name': 'John'  // ❌ Single quotes
}

Fixed:

{
  "name": "John"  // ✅ Double quotes
}

3. Unquoted Keys

Error:

{
  name: "John"  // ❌ Unquoted key
}

Fixed:

{
  "name": "John"  // ✅ Quoted key
}

4. Comments

Error:

{
  "name": "John",
  // This is a comment  // ❌ Comments not allowed
  "age": 30
}

Fixed:

{
  "name": "John",
  "age": 30
}

5. Undefined/NaN/Infinity

Error:

{
  "value": undefined,  // ❌ Not valid
  "number": NaN,       // ❌ Not valid
  "inf": Infinity      // ❌ Not valid
}

Fixed:

{
  "value": null,       // ✅ Use null
  "number": null,      // ✅ Use null or omit
  "inf": null          // ✅ Use null or omit
}

6. Missing Quotes in Strings

Error:

{
  "message": Hello World  // ❌ Missing quotes
}

Fixed:

{
  "message": "Hello World"  // ✅ Quoted string
}

Validation Best Practices

  1. Validate early: Check JSON before processing
  2. Use proper error messages: Include line/column numbers
  3. Handle edge cases: Empty strings, null values, etc.
  4. Test with malformed JSON: Ensure robust error handling

Common Use Cases

1. API Response Formatting

Unformatted API response:

{"status":"success","data":{"users":[{"id":1,"name":"John","email":"john@example.com"},{"id":2,"name":"Jane","email":"jane@example.com"}]}}

Formatted for readability:

{
  "status": "success",
  "data": {
    "users": [
      {
        "id": 1,
        "name": "John",
        "email": "john@example.com"
      },
      {
        "id": 2,
        "name": "Jane",
        "email": "jane@example.com"
      }
    ]
  }
}

2. Configuration Files

Terraform variables:

{
  "region": "us-east-1",
  "instance_type": "t3.medium",
  "tags": {
    "Environment": "production",
    "Project": "web-app"
  }
}

Kubernetes ConfigMap:

{
  "apiVersion": "v1",
  "kind": "ConfigMap",
  "metadata": {
    "name": "app-config"
  },
  "data": {
    "database_url": "postgresql://localhost:5432/mydb",
    "redis_url": "redis://localhost:6379"
  }
}

3. Package.json Formatting

Before:

{"name":"my-app","version":"1.0.0","dependencies":{"express":"^4.18.0","lodash":"^4.17.21"},"scripts":{"start":"node server.js","test":"jest"}}

After:

{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.18.0",
    "lodash": "^4.17.21"
  },
  "scripts": {
    "start": "node server.js",
    "test": "jest"
  }
}

4. AWS CloudFormation Templates

Formatted template:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "MyBucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-unique-bucket-name",
        "VersioningConfiguration": {
          "Status": "Enabled"
        }
      }
    }
  }
}

5. Log File Analysis

Minified log entry:

{"timestamp":"2024-01-01T12:00:00Z","level":"error","message":"Database connection failed","service":"api","request_id":"abc123"}

Formatted for debugging:

{
  "timestamp": "2024-01-01T12:00:00Z",
  "level": "error",
  "message": "Database connection failed",
  "service": "api",
  "request_id": "abc123"
}

Formatting in Different Languages

JavaScript/TypeScript

Format:

const json = '{"name":"John","age":30}';
const formatted = JSON.stringify(JSON.parse(json), null, 2);
console.log(formatted);

Minify:

const json = '{"name": "John", "age": 30}';
const minified = JSON.stringify(JSON.parse(json));
console.log(minified);

Validate:

function validateJson(json) {
  try {
    JSON.parse(json);
    return { valid: true };
  } catch (e) {
    return { valid: false, error: e.message };
  }
}

Python

Format:

import json
 
json_str = '{"name":"John","age":30}'
parsed = json.loads(json_str)
formatted = json.dumps(parsed, indent=2)
print(formatted)

Minify:

import json
 
json_str = '{"name": "John", "age": 30}'
parsed = json.loads(json_str)
minified = json.dumps(parsed, separators=(',', ':'))
print(minified)

Validate:

import json
 
def validate_json(json_str):
    try:
        json.loads(json_str)
        return {'valid': True}
    except json.JSONDecodeError as e:
        return {'valid': False, 'error': str(e)}

Command Line (jq)

Format:

echo '{"name":"John","age":30}' | jq .

Minify:

echo '{"name": "John", "age": 30}' | jq -c .

Validate:

echo '{"name":"John"}' | jq . > /dev/null && echo "Valid" || echo "Invalid"

Command Line (Python)

Format:

python -m json.tool input.json > output.json

Minify:

python -c "import json, sys; print(json.dumps(json.load(sys.stdin), separators=(',',':')))" < input.json

Best Practices

1. Consistent Indentation

Choose one style and stick with it:

  • 2 spaces (most common)
  • 4 spaces
  • Tabs (less common)

Don't mix styles within the same project.

2. Key Ordering

For objects:

  • Alphabetical ordering (easier to find keys)
  • Logical grouping (related keys together)
  • Important keys first (id, name, type)

Example:

{
  "id": 1,
  "name": "John",
  "email": "john@example.com",
  "metadata": {
    "created_at": "2024-01-01",
    "updated_at": "2024-01-02"
  }
}

3. Array Formatting

Short arrays (inline):

{
  "tags": ["javascript", "json", "formatting"]
}

Long arrays (multiline):

{
  "users": [
    {"id": 1, "name": "John"},
    {"id": 2, "name": "Jane"},
    {"id": 3, "name": "Bob"}
  ]
}

4. String Escaping

Escape special characters:

{
  "message": "He said \"Hello\"",
  "path": "C:\\Users\\Name",
  "newline": "Line 1\nLine 2"
}

5. Null vs Omission

Use null for explicit absence:

{
  "name": "John",
  "middle_name": null  // Explicitly no middle name
}

Omit for optional fields:

{
  "name": "John"
  // middle_name omitted if not applicable
}

Performance Considerations

File Size Impact

Formatted JSON:

  • Larger file size (whitespace)
  • Better for human reading
  • Better for version control diffs

Minified JSON:

  • Smaller file size (~20-30% reduction)
  • Faster network transfer
  • Better for production APIs

Parsing Performance

Parsing speed:

  • Minified JSON: Slightly faster (less characters to parse)
  • Formatted JSON: Slightly slower (more characters)
  • Difference is usually negligible

For large files (>1MB):

  • Consider minification for production
  • Format for development/debugging

Common Mistakes to Avoid

1. Manual Formatting

Don't manually format large JSON files:

  • Error-prone
  • Time-consuming
  • Inconsistent

Use tools:

  • JSON formatters
  • Editor plugins
  • Command-line tools

2. Inconsistent Formatting

Problem:

{
  "key1": "value1",
"key2": "value2",  // Inconsistent indentation
  "key3": "value3"
}

Solution: Use automated formatting tools to maintain consistency.

3. Not Validating Before Formatting

Always validate JSON before formatting:

  • Formatting invalid JSON won't fix errors
  • May hide syntax errors
  • Can cause confusion

4. Formatting Production APIs

Don't format JSON in production APIs:

  • Increases response size
  • Slows down transmission
  • Wastes bandwidth

Minify for production, format for development.

5. Mixing JSON and JavaScript

Don't confuse JSON with JavaScript objects:

// JavaScript (not JSON)
const obj = {
  name: 'John',  // No quotes needed
  age: 30,
  // Comments allowed
};
 
// JSON (must be valid)
const json = '{"name":"John","age":30}';  // Quotes required, no comments

Tools and Libraries

Online Tools

  • JSON Formatter & Validator: Format, validate, and minify JSON
  • JSONLint: Validate and format JSON
  • JSON Editor Online: Visual JSON editor

Editor Plugins

VS Code:

  • Prettier (automatic formatting)
  • JSON Tools
  • JSON Editor

Sublime Text:

  • Pretty JSON
  • JSONLint

Vim:

  • vim-json
  • jq.vim

Command-Line Tools

jq (most popular):

# Format
jq . file.json
 
# Minify
jq -c . file.json
 
# Validate
jq . file.json > /dev/null

Python json.tool:

python -m json.tool file.json

Node.js:

node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0)), null, 2))"

Frequently Asked Questions

What's the difference between JSON and JavaScript objects?

JSON:

  • String format
  • Keys must be quoted
  • No functions, undefined, or comments
  • Language-independent

JavaScript objects:

  • Native data type
  • Keys don't need quotes (unless special characters)
  • Can contain functions, undefined
  • JavaScript-specific

Can JSON have comments?

No. JSON does not support comments. If you need comments, consider:

  • Using a separate documentation file
  • Adding a _comment field (not standard)
  • Using JSON5 or JSONC (extensions with comment support)

Should I format JSON in production?

Generally no. Minify JSON for production to:

  • Reduce file size
  • Improve transmission speed
  • Save bandwidth

Format JSON for:

  • Development
  • Debugging
  • Documentation
  • Configuration files

How do I handle large JSON files?

For very large files (>100MB):

  • Consider streaming parsers
  • Use JSONL (JSON Lines) format
  • Split into multiple files
  • Use binary formats (MessagePack, BSON)

What's the maximum JSON size?

No official limit, but practical limits:

  • Browsers: ~100-500MB (varies)
  • Node.js: Limited by available memory
  • APIs: Usually 1-10MB (check API limits)

Can JSON have duplicate keys?

Technically yes, but behavior is undefined:

{
  "name": "John",
  "name": "Jane"  // Duplicate key - behavior undefined
}

Best practice: Don't use duplicate keys. Most parsers will use the last value.

How do I format JSON with custom indentation?

JavaScript:

JSON.stringify(obj, null, 4);  // 4 spaces
JSON.stringify(obj, null, '\t');  // Tabs

Python:

json.dumps(obj, indent=4)  # 4 spaces
json.dumps(obj, indent='\t')  # Tabs

Additional Resources