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

Что такое видеохостинги типа Ютуба, как на них можно загружать видео

Web

Как получить значения из выпадающего меню с помощью PHP

Web

Могу ли я расширить некоторый класс, используя более одного базового класса в PHP

Список доменов Google: все доменные имена, принадлежащие компании
Web

Список доменов Google: все доменные имена, принадлежащие компании

×