Utility Coder
← Back to Blog
Best Practices6 min read

JSON Formatting Best Practices for Developers

Master JSON formatting, validation, and manipulation. Learn how to beautify, minify, and work with JSON data efficiently in your applications.

By Andy Pham

JSON Formatting Best Practices for Developers

JSON (JavaScript Object Notation) has become the de facto standard for data interchange on the web. Proper JSON formatting is crucial for readability, maintainability, and debugging. This guide covers everything you need to know about working with JSON effectively.

Understanding JSON Structure

JSON is a lightweight, text-based data format based on JavaScript object literal notation. It consists of two fundamental structures:

Objects

Collections of key-value pairs enclosed in curly braces:

{
  "name": "John Doe",
  "age": 30,
  "isActive": true
}

Arrays

Ordered lists of values enclosed in square brackets:

[
  "apple",
  "banana",
  "orange"
]

JSON Data Types

JSON supports six data types:

1. String

{
  "message": "Hello, World!",
  "description": "Strings must be in double quotes"
}

2. Number

{
  "integer": 42,
  "float": 3.14159,
  "scientific": 1.5e10,
  "negative": -273.15
}

3. Boolean

{
  "isActive": true,
  "isDeleted": false
}

4. Null

{
  "middleName": null,
  "deletedAt": null
}

5. Object

{
  "address": {
    "street": "123 Main St",
    "city": "Springfield",
    "country": "USA"
  }
}

6. Array

{
  "tags": ["javascript", "json", "tutorial"],
  "coordinates": [40.7128, -74.0060]
}

Formatting Standards

Indentation

Use consistent indentation for readability. The standard is 2 or 4 spaces:

Good (2 spaces):

{
  "user": {
    "name": "Alice",
    "roles": [
      "admin",
      "editor"
    ]
  }
}

Bad (inconsistent):

{
"user": {
   "name": "Alice",
     "roles": [
"admin",
        "editor"
]
}
}

Key Naming Conventions

camelCase (most common in JavaScript):

{
  "firstName": "John",
  "lastName": "Doe",
  "phoneNumber": "555-0123"
}

snake_case (common in Python/Ruby):

{
  "first_name": "John",
  "last_name": "Doe",
  "phone_number": "555-0123"
}

kebab-case (less common, avoid if possible):

{
  "first-name": "John",
  "last-name": "Doe"
}

Choose one convention and stick to it throughout your project.

Property Ordering

Order properties logically:

{
  "id": 1,
  "type": "user",
  "name": "John Doe",
  "email": "john@example.com",
  "createdAt": "2025-01-04T10:00:00Z",
  "updatedAt": "2025-01-04T12:30:00Z"
}

Place important/identifying fields first, then data fields, then metadata fields.

Common Formatting Mistakes

1. Trailing Commas

Wrong:

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

Correct:

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

2. Single Quotes

Wrong:

{
  'name': 'John'
}

Correct:

{
  "name": "John"
}

3. Unquoted Keys

Wrong:

{
  name: "John"
}

Correct:

{
  "name": "John"
}

4. Comments

JSON doesn't support comments. If you need them, use a comment field:

Wrong:

{
  // This is a user object
  "name": "John"
}

Workaround:

{
  "_comment": "This is a user object",
  "name": "John"
}

Validation Best Practices

1. Always Validate Input

function parseJSONSafely(jsonString) {
  try {
    return JSON.parse(jsonString);
  } catch (error) {
    console.error('Invalid JSON:', error.message);
    return null;
  }
}

2. Use Schema Validation

Define schemas for your JSON data:

// Using JSON Schema
const userSchema = {
  type: "object",
  required: ["name", "email"],
  properties: {
    name: { type: "string", minLength: 1 },
    email: { type: "string", format: "email" },
    age: { type: "number", minimum: 0 }
  }
};

3. Validate Before Sending

function isValidJSON(str) {
  try {
    JSON.parse(str);
    return true;
  } catch (e) {
    return false;
  }
}

// Use before API calls
if (isValidJSON(data)) {
  fetch('/api/users', {
    method: 'POST',
    body: data
  });
}

Beautifying vs. Minifying

When to Beautify

Beautifying adds whitespace for human readability:

// Beautify for development/debugging
const beautified = JSON.stringify(obj, null, 2);
console.log(beautified);

Output:

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

When to Minify

Minifying removes whitespace to reduce size:

// Minify for production/transmission
const minified = JSON.stringify(obj);

Output:

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

Best Practice: Beautify during development, minify in production.

Working with Large JSON Files

1. Streaming Parsers

For very large files, use streaming parsers:

// Node.js example
const JSONStream = require('JSONStream');
const fs = require('fs');

fs.createReadStream('large-file.json')
  .pipe(JSONStream.parse('items.*'))
  .on('data', (item) => {
    // Process each item
    console.log(item);
  });

2. Pagination

Return large datasets in chunks:

{
  "data": [...],
  "pagination": {
    "page": 1,
    "pageSize": 100,
    "totalPages": 45,
    "totalItems": 4500
  }
}

3. Compression

Compress JSON for transfer:

// Using gzip
const zlib = require('zlib');
const compressed = zlib.gzipSync(JSON.stringify(largeObject));

Advanced Techniques

Custom Serialization

Control how objects are serialized:

const obj = {
  name: "John",
  password: "secret123",
  createdAt: new Date()
};

// Custom toJSON method
obj.toJSON = function() {
  return {
    name: this.name,
    createdAt: this.createdAt.toISOString()
    // password excluded
  };
};

JSON.stringify(obj);

Replacer Function

Filter or transform during stringification:

const data = {
  name: "John",
  password: "secret",
  age: 30
};

// Exclude password
const json = JSON.stringify(data, (key, value) => {
  if (key === 'password') return undefined;
  return value;
});

Reviver Function

Transform during parsing:

const json = '{"date":"2025-01-04T10:00:00Z"}';

const obj = JSON.parse(json, (key, value) => {
  if (key === 'date') return new Date(value);
  return value;
});

Error Handling

Common JSON Errors

function parseWithDetailedError(jsonString) {
  try {
    return JSON.parse(jsonString);
  } catch (error) {
    if (error instanceof SyntaxError) {
      const match = error.message.match(/position (d+)/);
      if (match) {
        const position = parseInt(match[1]);
        const context = jsonString.substring(
          Math.max(0, position - 20),
          Math.min(jsonString.length, position + 20)
        );
        console.error(`Syntax error near: "${context}"`);
      }
    }
    throw error;
  }
}

Performance Optimization

1. Avoid Deep Nesting

Bad:

{
  "level1": {
    "level2": {
      "level3": {
        "level4": {
          "data": "value"
        }
      }
    }
  }
}

Better:

{
  "level1_level2_level3_level4_data": "value"
}

Or use separate objects with references.

2. Use Appropriate Data Structures

Inefficient (array search):

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

Better (object lookup):

{
  "users": {
    "1": {"name": "John"},
    "2": {"name": "Jane"}
  }
}

3. Lazy Loading

Don't include everything in one response:

{
  "user": {
    "id": 1,
    "name": "John",
    "postsUrl": "/api/users/1/posts",
    "friendsUrl": "/api/users/1/friends"
  }
}

Security Considerations

1. Sanitize User Input

Never trust user-provided JSON:

function sanitizeJSON(input) {
  try {
    // Parse to validate structure
    const parsed = JSON.parse(input);

    // Validate against schema
    if (!validateSchema(parsed)) {
      throw new Error('Invalid schema');
    }

    return parsed;
  } catch (error) {
    throw new Error('Invalid JSON input');
  }
}

2. Avoid eval()

Never do this:

const obj = eval('(' + jsonString + ')'); // DANGEROUS!

Always use JSON.parse():

const obj = JSON.parse(jsonString); // SAFE

3. Content-Type Headers

Always set correct headers:

fetch('/api/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
});

Tools and Resources

Use these tools for JSON operations:

Conclusion

Mastering JSON formatting is essential for modern web development. Key takeaways:

  • Use consistent formatting and naming conventions
  • Validate all JSON input and output
  • Choose beautification or minification based on context
  • Handle errors gracefully
  • Consider performance for large datasets
  • Never compromise on security

By following these best practices, you'll write cleaner, more maintainable code and avoid common pitfalls when working with JSON data.

Share this article