LoginSignup
1
0

More than 1 year has passed since last update.

日本語をエスケープしないでJSON文字列を作る

Last updated at Posted at 2021-05-14

概要

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);
}

こっちの方が実装が楽ですね。
こんなオプションがあったとは知らなかった... (^^;)

参考サイト

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0