721 votes

Impression JSON avec PHP

Je suis en train de construire un script PHP qui se nourrit des données JSON à un autre script. Mon script crée des données dans un grand tableau associatif, puis renvoie les données à l'aide d' json_encode. Voici un exemple de script:

$Data = array('a' => 'apple', 'b' => 'banana', 'c' => 'catnip');
header('Content-type: text/javascript');
echo json_encode($Data);

Le code ci-dessus donne le résultat suivant:

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

Ce qui est excellent si vous avez une petite quantité de données, mais je préfère quelque chose le long de ces lignes:

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

Est-il un moyen de le faire en PHP sans un vilain hack? Il semble que quelqu'un sur Facebook pensé à elle.

1373voto

countfloortiles Points 2537

PHP 5.4 offre la option pour une utilisation avec le appeler.

http://php.net/Manual/en/function.JSON-encode.php

196voto

Kendall Hopkins Points 12193

Cette fonction prend la chaîne JSON et tiret, il est très lisible. Il devrait également être convergente,

Entrée

Sortie

Code

41voto

Jason Points 5421

J’ai eu le même problème.

En tout cas, j’ai juste utilisé le json mise en forme du code ici :

http://Recursive-Design.com/blog/2008/03/11/format-JSON-with-php/

Fonctionne bien pour ce que j’en avais besoin pour.

Et une version plus entretenue : https://github.com/GerHobbelt/nicejson-php

11voto

ulk200 Points 51

J'ai pris le code du Compositeur : https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php et nicejson : https://github.com/GerHobbelt/nicejson-php/blob/master/nicejson.php Compositeur code est bon parce qu'il couramment mises à jour à partir de 5.3 à 5.4, mais il ne code pour objet alors que nicejson prend chaînes json, j'ai donc fusionné. Le code peut être utilisé pour le format json de chaîne et/ou coder des objets, je suis en train de l'utiliser dans un module 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)
        {
            // Add a space after the : character
            $char .= ' ';
        }
        elseif (('}' === $char || ']' === $char))
        {
            $pos--;
            $prevChar = substr($json, $i - 1, 1);

            if ('{' !== $prevChar && '[' !== $prevChar)
            {
                // If this character is the end of an element,
                // output a new line and indent the next line
                $result .= $newLine;
                for ($j = 0; $j < $pos; $j++)
                {
                    $result .= $indentStr;
                }
            }
            else
            {
                // Collapse empty {} and []
                $result = rtrim($result) . "\n\n" . $indentStr;
            }
        }

        $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)
        {
            $result .= $newLine;

            if ('{' === $char || '[' === $char)
            {
                $pos++;
            }

            for ($j = 0; $j < $pos; $j++)
            {
                $result .= $indentStr;
            }
        }
    }
    // If buffer not empty after formating we have an unclosed quote
    if (strlen($buffer) > 0)
    {
        //json is incorrectly formatted
        $result = false;
    }

    return $result;
}

10voto

Jay Sidri Points 3447

Si vous êtes sur firefox installer JSONovich. Pas vraiment une solution PHP je sais, mais il fait le tour pour fins de développement/débogage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X