Implementing Pretty Print Output of JSON.stringify in HTML

Nov 19, 2025 · Programming · 9 views · 7.8

Keywords: JSON.stringify | HTML display | pre tag | pretty print | JavaScript

Abstract: This article explores how to correctly display the formatted output of JSON.stringify in HTML pages. By analyzing the JSON.stringify method and its parameters in JavaScript, it explains why formatting fails when directly outputting to div elements and provides the correct solution using pre tags. The article also delves into the handling of whitespace characters in HTML, compares the pros and cons of different output methods, and supplements with the implementation of custom formatting functions.

Problem Background and Core Challenges

In web development practice, developers often need to display JavaScript objects in a readable format to users. The JSON.stringify method provides built-in formatting functionality through the third parameter that specifies the number of spaces for indentation. However, when attempting to output the formatted JSON string to an HTML page, formatting often fails to display correctly.

The root cause lies in HTML's whitespace handling mechanism. HTML ignores consecutive whitespace characters (including spaces, tabs, and line breaks), preserving only the first whitespace character. This means that even if JSON.stringify generates a string with proper indentation and line breaks, when inserted into regular HTML elements (such as div), these formatting details are ignored by the browser.

Solution: Using the pre Tag

The most direct and effective solution is to use the <pre> tag. The <pre> element is specifically designed to display preformatted text, preserving all whitespace characters in the text, including spaces, tabs, and line breaks.

Here is a complete implementation example:

<!DOCTYPE html>
<html>
<head>
    <title>JSON Pretty Print Example</title>
</head>
<body>
    <pre id="json-output"></pre>
    
    <script>
        // Example JSON data
        var message = {
            "data": {
                "x": "1",
                "y": "1", 
                "url": "http://url.com"
            },
            "event": "start",
            "show": 1,
            "id": 50
        };
        
        // Use JSON.stringify for pretty printing
        var prettyJSON = JSON.stringify(message, null, 2);
        
        // Output to pre element
        document.getElementById("json-output").textContent = prettyJSON;
    </script>
</body>
</html>

In this example, the third parameter of JSON.stringify is set to 2, indicating the use of two spaces for indentation. By assigning the formatted string to the textContent property of the pre element, all formatting characters are guaranteed to display correctly.

Technical Details Analysis

JSON.stringify Parameters Detailed

The JSON.stringify method accepts three parameters:

JSON.stringify(value, replacer, space)

When the space parameter is a number, it represents the number of spaces to use for each level of indentation; when it's a string, that string is used as the indentation unit.

Difference Between innerHTML and textContent

Choosing the correct DOM manipulation method is crucial in implementation:

// Correct: Using textContent
preElement.textContent = jsonString;

// Incorrect: Using innerHTML
preElement.innerHTML = jsonString;

Using textContent ensures that special characters in the JSON string (such as <, >, &, etc.) are not parsed as HTML tags but displayed as plain text. If innerHTML is used, these characters may be incorrectly parsed, leading to display anomalies or security issues.

Alternative Solutions and Extended Implementation

Custom Formatting Function

Although JSON.stringify already provides built-in formatting functionality, understanding the principles of custom implementation remains valuable. Here is a simplified formatting function implementation:

function customPrettyPrint(jsonString) {
    let indentLevel = 0;
    let result = '';
    
    for (let i = 0; i < jsonString.length; i++) {
        let char = jsonString[i];
        
        if (char === '{' || char === '[') {
            result += char + '\n' + '  '.repeat(++indentLevel);
        } else if (char === '}' || char === ']') {
            result += '\n' + '  '.repeat(--indentLevel) + char;
        } else if (char === ',') {
            result += char + '\n' + '  '.repeat(indentLevel);
        } else {
            result += char;
        }
    }
    
    return result;
}

This function tracks the indentation level and inserts line breaks and indentation spaces at appropriate positions, implementing basic JSON formatting functionality.

CSS Styling Enhancement

To enhance user experience, appropriate CSS styles can be added to the pre element:

<style>
pre.json-output {
    background-color: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 4px;
    padding: 10px;
    font-family: 'Courier New', monospace;
    font-size: 14px;
    line-height: 1.4;
    overflow-x: auto;
    white-space: pre-wrap;
    word-wrap: break-word;
}
</style>

Best Practices Summary

  1. Always use pre elements: For displaying text content that requires preserved formatting
  2. Use textContent instead of innerHTML: Avoid HTML parsing issues
  3. Set appropriate indentation: Typically use 2 or 4 spaces as indentation units
  4. Add appropriate styling: Improve readability and user experience
  5. Consider performance impact: Formatting output may affect performance for large JSON objects

By following these best practices, developers can ensure that JSON data is presented to users in a clear, readable format on web pages, enhancing the overall user experience of the application.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.