json データを取得し、それをフォーマットして読みやすくする「単純な」スクリプトはどこかにありますか?
例えば:
// $response is a json encoded string.
var_dump($response);
上記は、すべてを 1 行に出力します。読みやすくするためにインデントと間隔を空けてください。
var_dump
およびその簡潔ないとこは改行を出力することに注意してください。var_export
デフォルトでは、改行は HTML ドキュメントに表示されないことに注意してください。HTML コンテキストでは、代わりにこれが必要です。
echo '<div style="font-family: monospace; white-space:pre;">';
echo htmlspecialchars(var_export($response));
echo '</div>';
PHP 5.4 以降では、単純にjson_encodePRETTY_PRINT
のフラグを使用できます。
echo json_encode($response, JSON_PRETTY_PRINT);
繰り返しますが、HTML コンテキストでは、上記のようにラップする必要があります。
それをJSONLint.comに貼り付けて、[検証] をクリックします。
同様の問題がありました。シリアル化された JavaScript オブジェクトを php スクリプトに投稿していて、それを人間が読める形式でサーバーに保存したかったのです。
webdeveloper.com フォーラムでこの投稿を見つけ、自分の感性に合うようにコードを微調整しました (json でエンコードされた文字列が必要です)。
function jsonToReadable($json){
$tc = 0; //tab count
$r = ''; //result
$q = false; //quotes
$t = "\t"; //tab
$nl = "\n"; //new line
for($i=0;$i<strlen($json);$i++){
$c = $json[$i];
if($c=='"' && $json[$i-1]!='\\') $q = !$q;
if($q){
$r .= $c;
continue;
}
switch($c){
case '{':
case '[':
$r .= $c . $nl . str_repeat($t, ++$tc);
break;
case '}':
case ']':
$r .= $nl . str_repeat($t, --$tc) . $c;
break;
case ',':
$r .= $c;
if($json[$i+1]!='{' && $json[$i+1]!='[') $r .= $nl . str_repeat($t, $tc);
break;
case ':':
$r .= $c . ' ';
break;
default:
$r .= $c;
}
}
return $r;
}
通り過ぎる
{"object":{"array":["one","two"],"sub-object":{"one":"string","two":2}}}
戻り値
{
"object": {
"array": [
"one",
"two"
],
"sub-object": {
"one": "string",
"two": 2
}
}
}
json_encode($response, JSON_PRETTY_PRINT);
今は 2017 年のことで、最新バージョンの PHP を使用しているすべての人にとって、これが答えになるはずです。
JSON 文字列を好みに合わせてエンコードする方法には、多くのオプションが存在することに注意してください。php.netから:
JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR
echo '<pre>';
print_r(json_decode($response));
echo '</pre>';
単純すぎます?
python を使用するという提案は、私にとってはうまくいきました。PHP からこれを使用するためのコードを次に示します。
function jsonEncode( $data, $pretty = false ) {
$str = json_encode($data);
if( $pretty ) {
$descriptorSpec = array(
0 => array('pipe', 'r'), // stdin is a pipe that the child will read from
1 => array('pipe', 'w'), // stdout is a pipe that the child will write to
);
$fp = proc_open('/usr/bin/python -mjson.tool', $descriptorSpec, $pipes);
fputs($pipes[0], $str);
fclose($pipes[0]);
$str = '';
while( !feof($pipes[1]) ) {
$str .= $chunk = fgets($pipes[1], 1024);
}
fclose($pipes[1]);
}
return $str;
}
にパイプしますpython -mjson.tool
。