[PHP]デバッグ時にjson_encode()の出力を見やすくする(JSON_PRETTY_PRINTオプション)

カテゴリ: デバッグ | タグ:

XDebugなどのデバッガがない環境でプログラムの開発・デバッグを行っているとき、変数の中身をjson_encode()で確認したいときが良くあります。ですがjson_encode()はデータが複雑だったり、サイズが大きいと可読性が悪いという問題があります。

今回は、json_encode()の結果を見やすく出力するTipsを紹介します。

実行例

下記のプログラムはjson_encode()出力の実行例です。

<?php

$itemDatas =[];
for ($i = 0; $i < 5; $i++) {
    $itemDatas[] = [
        "itemName" => "ITEM_{$i}",
        "qty" => $i,
    ];
}

echo json_encode($itemDatas);

このプログラムを実行すると、以下のように1行で出力されてしまいます。今回の例だと、構造が単純なので頑張れば読めますが、構造が複雑になってくるとデバッグ出力の確認に手間取ってしまいます。

[{"itemName":"ITEM_0","qty":0},{"itemName":"ITEM_1","qty":1},{"itemName":"ITEM_2","qty":2},{"itemName":"ITEM_3","qty":3},{"itemName":"ITEM_4","qty":4}]

JSON_PRETTY_PRINTオプションで、結果を見やすくする

このような場合、json_encodeの第二引数にJSON_PRETTY_PRINTを指定すると見やすいです。

echo json_encode($itemDatas);
↓
echo json_encode($itemDatas, JSON_PRETTY_PRINT);

出力結果は以下のように適切な場所で改行されるので、人が目視で見て確認しやすくなります。

[
    {
        "itemName": "ITEM_0",
        "qty": 0
    },
    {
        "itemName": "ITEM_1",
        "qty": 1
    },
    {
        "itemName": "ITEM_2",
        "qty": 2
    },
    {
        "itemName": "ITEM_3",
        "qty": 3
    },
    {
        "itemName": "ITEM_4",
        "qty": 4
    }
]

json_encode()にたいするJSON_PRETTY_PRINTオプションは、PHP5.4で追加されたため、5.4い以降の環境でのみ動作します。

PHP5.3以下の環境で同じことを行いたい場合は...

PHP5.3以前の古いPHPで同じことを行いたい場合は、php.netのjson_encode()関数のコメント欄で似たような処理を行う自作関数を提供してくれています。
下記の関数をコピーしてくると簡単に、ほぼ同等の事が行えます。

function json_readable_encode($in, $indent = 0, $from_array = false)
{
    $_myself = __FUNCTION__;
    $_escape = function ($str) {
        return preg_replace("!([\b\t\n\r\f\"\\'])!", "\\\\\\1", $str);
    };

    $out = '';

    foreach ($in as $key=>$value) {
        $out .= str_repeat("\t", $indent + 1);
        $out .= "\"".$_escape((string)$key)."\": ";

        if (is_object($value) || is_array($value)) {
            $out .= "\n";
            $out .= $_myself($value, $indent + 1);
        } elseif (is_bool($value)) {
            $out .= $value ? 'true' : 'false';
        } elseif (is_null($value)) {
            $out .= 'null';
        } elseif (is_string($value)) {
            $out .= "\"" . $_escape($value) ."\"";
        } else {
            $out .= $value;
        }

        $out .= ",\n";
    }

    if (!empty($out)) {
        $out = substr($out, 0, -2);
    }

    $out = str_repeat("\t", $indent) . "{\n" . $out;
    $out .= "\n" . str_repeat("\t", $indent) . "}";
    return $out;
}

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。