Source of file ApiResponseSerialiser_Json.php
Size: 3,983 Bytes - Last Modified: 2019-07-06T11:19:46+00:00
/var/www/docs.ssmods.com/process/src/src/ApiResponseSerialiser_Json.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | <?php namespace GovtNZ\SilverStripe\Api; class ApiResponseSerialiser_Json { public function execute($controller) { $controller->getResponse()->addHeader('Content-Type', 'application/json'); return $this->json_format($controller->formatOutput()); } // ------------------------------------------------------------------------ /** * Format a flat JSON string to make it more human-readable * https://github.com/GerHobbelt/nicejson-php.git * * @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 */ private 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 = "\t"; $newLine = "\n"; $prevChar = ''; $outOfQuotes = true; for ($i = 0; $i < $strLen; $i++) { // Speedup: copy blocks of input which don't matter re string detection and formatting. $copyLen = strcspn($json, $outOfQuotes ? " \t\r\n\",:[{}]" : "\\\"", $i); if ($copyLen >= 1) { $copyStr = substr($json, $i, $copyLen); // Also reset the tracker for escapes: we won't be hitting any right now // and the next round is the first time an 'escape' character can be seen again at the input. $prevChar = ''; $result .= $copyStr; $i += $copyLen - 1; // correct for the for(;;) loop continue; } // Grab the next character in the string $char = substr($json, $i, 1); // Are we inside a quoted string encountering an escape sequence? if (!$outOfQuotes && $prevChar === '\\') { // Add the escaped character to the result string and ignore it for the string enter/exit detection: $result .= $char; $prevChar = ''; continue; } // Are we entering/exiting 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 elseif ($outOfQuotes && ($char === '}' || $char === ']')) { $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 elseif ($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 ($outOfQuotes && $char === ':') { $result .= ' '; } // If the last character was the beginning of an element, // output a new line and indent the next line elseif ($outOfQuotes && ($char === ',' || $char === '{' || $char === '[')) { $result .= $newLine; if ($char === '{' || $char === '[') { $pos++; } for ($j = 0; $j < $pos; $j++) { $result .= $indentStr; } } $prevChar = $char; } return $result; } } |