Created
December 11, 2013 15:39
-
-
Save lyoshenka/7912602 to your computer and use it in GitHub Desktop.
Pretty print JSON
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// https://github.com/GerHobbelt/nicejson-php/blob/master/nicejson.php | |
// original code: http://www.daveperrett.com/articles/2008/03/11/format-json-with-php/ | |
// adapted to allow native functionality in php version >= 5.4.0 | |
/** | |
* Format a flat JSON string to make it more human-readable | |
* | |
* @param string $json The original JSON string to process | |
* When the input is not a string it is assumed the input is RAW | |
* and should be converted to JSON first of all. | |
* @return string Indented version of the original JSON string | |
*/ | |
function json_format($json) { | |
if (!is_string($json)) | |
{ | |
if (phpversion() && phpversion() >= 5.4) | |
{ | |
return json_encode($json, JSON_PRETTY_PRINT); | |
} | |
$json = json_encode($json); | |
} | |
$result = ''; | |
$pos = 0; // indentation level | |
$strLen = strlen($json); | |
$indentStr = " "; | |
$newLine = "\n"; | |
$prevChar = ''; | |
$outOfQuotes = 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 == '"' && $prevChar != '\\') | |
{ | |
$outOfQuotes = !$outOfQuotes; | |
} | |
// If this character is the end of an element, | |
// output a new line and indent the next line | |
else if (($char == '}' || $char == ']') && $outOfQuotes) | |
{ | |
$result .= $newLine; | |
$pos--; | |
for ($j = 0; $j < $pos; $j++) | |
{ | |
$result .= $indentStr; | |
} | |
} | |
// eat all non-essential whitespace in the input as we do our own here and it would only mess up our process | |
else if ($outOfQuotes && false !== strpos(" \t\r\n", $char)) | |
{ | |
continue; | |
} | |
// Add the character to the result string | |
$result .= $char; | |
// always add a space after a field colon: | |
if ($char == ':' && $outOfQuotes) | |
{ | |
$result .= ' '; | |
} | |
// If the last character was the beginning of an element, | |
// output a new line and indent the next line | |
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) | |
{ | |
$result .= $newLine; | |
if ($char == '{' || $char == '[') | |
{ | |
$pos++; | |
} | |
for ($j = 0; $j < $pos; $j++) | |
{ | |
$result .= $indentStr; | |
} | |
} | |
$prevChar = $char; | |
} | |
return $result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment