Web

Отображение JSON с помощью PHP

Я создал сценарий PHP, который передает данные JSON другому сценарию. Мой скрипт собирает данные в большой ассоциативный массив, а затем выводит данные с использованием json_encode. Вот пример сценария:

$data = array('a' => 'apple', 'b' => 'banana', 'c' => 'catnip');

header('Content-type: text/javascript');

echo json_encode($data);

 

Приведенный выше код дает следующий результат:

{"a":"apple","b":"banana","c":"catnip"}

 

Это работает, если у вас небольшой объем данных, но я бы предпочел что-то вроде этого:

{

    "a": "apple",

    "b": "banana",

    "c": "catnip"

}

 

Есть ли способ сделать это в PHP без хакинга?

 

Ответ 1

PHP 5.4 предлагает JSON_PRETTY_PRINT возможность использования с вызовом json_encode().

<?php

...

$json_string = json_encode($data, JSON_PRETTY_PRINT);

 

Ответ 2

Эта функция возьмет строку JSON и сделает ее полезной для использования в этом варианте:

prettyPrint( $json ) === prettyPrint( prettyPrint( $json ) )

 

На входе:

{"key1":[1,2,3],"key2":"value"}

 

На выходе:

{

    "key1": [

        1,

        2,

        3

    ],

    "key2": "value"

}

 

Код такой:

function prettyPrint( $json ) {

    $result = '';

    $level = 0;

    $in_quotes = false;

    $in_escape = 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 ( $in_escape ) {

            $in_escape = false;

        } else if( $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;

            }

        } else if ( $char === '\\' ) {

            $in_escape = true;

        }

        if( $new_line_level !== NULL ) {

            $result .= "\n".str_repeat( "\t", $new_line_level );

        }

        $result .= $char.$post;

    }

    return $result;

}

 

 

Ответ 3

Я понимаю, что этот вопрос касается того, как кодировать ассоциативный массив в красиво отформатированную строку JSON, поэтому это не дает прямого ответа на вопрос, но, если у вас есть строка, которая уже находится в формате JSON, вы можете сделать это довольно просто путем его декодирования и перекодирования (требуется PHP> = 5.4):

$json = json_encode(json_decode($json), JSON_PRETTY_PRINT);

 

Пример:

header('Content-Type: application/json');

$json_ugly = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

$json_pretty = json_encode(json_decode($json_ugly), JSON_PRETTY_PRINT);

echo $json_pretty;

Это выводит:

{

    "a": 1,

    "b": 2,

    "c": 3,

    "d": 4,

    "e": 5

}

 

Ответ 4

Вот мой код:

echo "<pre>"; 

echo json_encode(json_decode($json_response), JSON_PRETTY_PRINT); 

echo "</pre>";

 

Output: {

    "data": {

        "token_type": "bearer",

        "expires_in": 3628799,

        "scopes": "full_access",

        "created_at": 1540504324

    },

    "errors": [],

    "pagination": {},

    "token_type": "bearer",

    "expires_in": 3628799,

    "scopes": "full_access",

    "created_at": 1540504324

}

 

 

Ответ 5

Я взял код из Composer. Код можно использовать для форматирования строки json и/или кодирования объектов. Можно применить для Drupal.

if (!defined('JSON_UNESCAPED_SLASHES'))

    define('JSON_UNESCAPED_SLASHES', 64);

if (!defined('JSON_PRETTY_PRINT'))

    define('JSON_PRETTY_PRINT', 128);

if (!defined('JSON_UNESCAPED_UNICODE'))

    define('JSON_UNESCAPED_UNICODE', 256);

 

function _json_encode($data, $options = 448) {

    if (version_compare(PHP_VERSION, '5.4', '>=')) {

        return json_encode($data, $options);

    }

    return _json_format(json_encode($data), $options);

}

function _pretty_print_json($json) {

    return _json_format($json, JSON_PRETTY_PRINT);

}

function _json_format($json, $options = 448) {

    $prettyPrint = (bool) ($options & JSON_PRETTY_PRINT);

    $unescapeUnicode = (bool) ($options & JSON_UNESCAPED_UNICODE);

    $unescapeSlashes = (bool) ($options & JSON_UNESCAPED_SLASHES);

    if (!$prettyPrint && !$unescapeUnicode && !$unescapeSlashes) {

        return $json;

    }

    $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;

        }

        elseif ('' !== $buffer) {

            if ($unescapeSlashes) {

                $buffer = str_replace('\\/', '/', $buffer);

            }

            if ($unescapeUnicode && function_exists('mb_convert_encoding')) {

                // http://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha

                $buffer = preg_replace_callback('/\\\\u([0-9a-f]{4})/i',

                    function ($match) {

                        return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');

                    }, $buffer);

            } 

            $result .= $buffer . $char;

            $buffer = '';

            continue;

        }

        elseif(false !== strpos(" \t\r\n", $char)) {

            continue;

        }

        if (':' === $char) {

            // Добавьте пробел после символа:

            $char .= ' ';

        } elseif (('}' === $char || ']' === $char)) {

            $pos--;

            $prevChar = substr($json, $i - 1, 1);

            if ('{' !== $prevChar && '[' !== $prevChar) {

                // Если этот символ является концом элемента,

                // выводится новая строка и делается отступ от следующей строки

                $result .= $newLine;

                for ($j = 0; $j < $pos; $j++) {

                    $result .= $indentStr;

                }

            } else {

                // Свернуть пустые {} и []

                $result = rtrim($result) . "\n\n" . $indentStr;

            }

        }

        $result .= $char;

        // Если последний символ был началом элемента,

        // выведите новую строку и сделайте отступ от следующей строки

        if (',' === $char || '{' === $char || '[' === $char) {

            $result .= $newLine;

            if ('{' === $char || '[' === $char) {

                $pos++;

            }

            for ($j = 0; $j < $pos; $j++) {

                $result .= $indentStr;

            }

        }

    }

    // Если буфер не пуст после форматирования, мы имеем незакрытую цитату

    if (strlen($buffer) > 0) {

        //json неверно отформатирован

        $result = false;

    }

    return $result;

}

Схожие статьи

Web

Получение элементов DOM по имени класса

Web

Преобразовать разделенных двоеточиями массив ключ: значение в массив с ключами

Web

Как заставить PHP перестать заменять символы «.» в массивах $_GET или $_POST

Что такое веб-дизайнер. Описание профессии и ее подводные камни
Web

Что такое веб-дизайнер. Описание профессии и ее подводные камни

×