1. 程式人生 > >PHP格式化輸出json資料

PHP格式化輸出json資料

/**
 * 格式化輸出json資料
 * @param  $json 待輸出資料
 * @return json格式化後的資料
 */
function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $prev_char = '';
    $in_quotes = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if( $char === '"' && $prev_char != '\\' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "    ", $new_line_level );
        }
        $result .= $char.$post;
        $prev_char = $char;
    }

    return $result;
}
/**
 * 格式化輸出json資料
 * @param  $json 待輸出資料
 * @return json格式化後的資料
 */
function indent ($json) { 

    $result = ''; 
    $pos = 0; 
    $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; 
            } 
        } 
        // Add the character to the result string. 
        $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 == '[') && $outOfQuotes) { 
            $result .= $newLine; 
            if ($char == '{' || $char == '[') { 
                $pos ++; 
            } 
            for ($j = 0; $j < $pos; $j++) { 
                $result .= $indentStr; 
            } 
        } 
        $prevChar = $char; 
    } 

    return $result; 
}
測試:
$a = "{\"_ad_url\": \",\"_aid\": 0,\"_effective\": 0,\"_focus_desc\": \",\"_focus_pic\": \",\"_focus_title\": \",\"_icourl\": \",\"_tv_id\": 0,\"_type\": 0,\"aid\": 215114700,\"focus_desc\": \",\"focus_pic\": \"http://pic4.qiyipic.com/common/20131210/9d4c967e06fc4fb5af2d93ba1763c8ee.jpg\",\"focus_title\": \"光的棍\",\"icourl\": \"http://pic7.qiyipic.com/common/20131210/e1bdd19da1ff45ca8f32a71fd8a870d7.jpg\",\"open_type\": 0,\"source\": \",\"topic_list\": [],\"tv_id\": 0,\"type\": 0}";
echo "<pre>";
echo indent($a);
echo prettyPrint($a);
echo '</pre>';