概要
JSON形式で保存されているログを画面出力することがあった。
しかし、 json_encode()
した文字列のままだと、
日本語部分が文字化けしたように読めない。
そのため、一度デコードして、整形し直してみる。
独自関数を作ってみる...
$log=print_r($json, true)
でも配列の中身を出力できるが、
bool型のところがfalseの場合空文字になったりとイマイチ見た目が悪かった。
そのため、独自関数を作って対応してみる。
/**
* @param string $json
* @param bool $is_vector
* @return string
*/
function decodeMbJsonString (string $json, $is_vector = false) {
// 一度デコードして、日本語を読めるようにする
$data = json_decode($json, true);
// JSON形式に再整形する
$data = array_map(function ($key, $value) {
if (is_null($value)) {
// nullの場合、nullという文字列に変換する
$value = 'null';
} else if (is_bool($value)) {
// bool型の場合、文字列に変換する
$value = $value === true ? 'true' : 'false';
} else if (is_array($value)) {
// 配列か連想配列か判定して、再帰処理する
$is_vector = (array_values($value) === $value);
$value = $this->decodeMbJsonString($value, $is_vector);
}
// キーが整数の場合は、「"」で囲まないようにする
$format = (is_int($key)) ? '%s:"%s"' : '"%s":"%s"';
return sprintf($format, $key, $value);
}, array_keys($data), array_values($data));
$format = ($is_vector === true) ? '[%s]' : '{%s}';
return sprintf($format, implode(',', $data));
}
json_encodeで対応できそう...
json_encode()
関数のオプションで対応可能なようです。
function decodeMbJsonString (string $json) {
$data = json_decode($message, true);
return json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
}
こっちの方が実装が楽ですね。
こんなオプションがあったとは知らなかった... (^^;)
参考サイト
以上