Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. JsonFormatter.php

function JsonFormatter::format

This code is based on the function found at: http://recursive-design.com/blog/2008/03/11/format-json-with-php/

Originally licensed under MIT by Dave Perrett <mail@recursive-design.com>

Parameters

bool $unescapeUnicode Un escape unicode:

bool $unescapeSlashes Un escape slashes:

File

vendor/composer/composer/src/Composer/Json/JsonFormatter.php, line 38

Class

JsonFormatter
Formats json strings used for php < 5.4 because the json_encode doesn't supports the flags JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE in these versions

Namespace

Composer\Json

Code

public static function format(string $json, bool $unescapeUnicode, bool $unescapeSlashes) : string {
    $result = '';
    $pos = 0;
    $strLen = strlen($json);
    $indentStr = '    ';
    $newLine = "\n";
    $outOfQuotes = true;
    $buffer = '';
    $noescape = true;
    for ($i = 0; $i < $strLen; $i++) {
        // Grab the next character in the string
        $char = substr($json, $i, 1);
        // Are we inside a quoted string?
        if ('"' === $char && $noescape) {
            $outOfQuotes = !$outOfQuotes;
        }
        if (!$outOfQuotes) {
            $buffer .= $char;
            $noescape = '\\' === $char ? !$noescape : true;
            continue;
        }
        if ('' !== $buffer) {
            if ($unescapeSlashes) {
                $buffer = str_replace('\\/', '/', $buffer);
            }
            if ($unescapeUnicode && function_exists('mb_convert_encoding')) {
                // https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha
                $buffer = Preg::replaceCallback('/(\\\\+)u([0-9a-f]{4})/i', static function ($match) : string {
                    $l = strlen($match[1]);
                    if ($l % 2) {
                        $code = hexdec($match[2]);
                        // 0xD800..0xDFFF denotes UTF-16 surrogate pair which won't be unescaped
                        // see https://github.com/composer/composer/issues/7510
                        if (0xd800 <= $code && 0xdfff >= $code) {
                            return $match[0];
                        }
                        return str_repeat('\\', $l - 1) . mb_convert_encoding(pack('H*', $match[2]), 'UTF-8', 'UCS-2BE');
                    }
                    return $match[0];
                }, $buffer);
            }
            $result .= $buffer . $char;
            $buffer = '';
            continue;
        }
        if (':' === $char) {
            // Add a space after the : character
            $char .= ' ';
        }
        elseif ('}' === $char || ']' === $char) {
            $pos--;
            $prevChar = substr($json, $i - 1, 1);
            if ('{' !== $prevChar && '[' !== $prevChar) {
                // If this character is the end of an element,
                // output a new line and indent the next line
                $result .= $newLine;
                $result .= str_repeat($indentStr, $pos);
            }
            else {
                // Collapse empty {} and []
                $result = rtrim($result);
            }
        }
        $result .= $char;
        // If the last character was the beginning of an element,
        // output a new line and indent the next line
        if (',' === $char || '{' === $char || '[' === $char) {
            $result .= $newLine;
            if ('{' === $char || '[' === $char) {
                $pos++;
            }
            $result .= str_repeat($indentStr, $pos);
        }
    }
    return $result;
}
RSS feed
Powered by Drupal