PHPで配列やオブジェクトを一行のJSON文字列に文字列にする方法

こんにちは、さるまりんです。

プログラミングをしていてログに配列やオブジェクトの内容をそのまま吐き出したいことがありました。

こんな配列とオブジェクトがあったとします。

$ary = [
  'name' => 'salumarine',
  'site' => 'https://salumarine.com/',
  'address' => [
    'city' => 'Seattle',
    'state' => 'WA',
    'zip' => '98102'  
  ],
];

$adr = new stdClass();
$adr->city = 'シアトル';
$adr->state = 'ワシントン州';
$adr->zip = '98102';
$obj = new stdClass();
$obj->name = 'さるまりん';
$obj->site = 'https://salumarine.com/';
$obj->address = $adr;

print_r()で配列やオブジェクトの文字列表現が取れるので、

echo print_r($ary, true);
echo print_r($obj, true);

下のように出力すると↓の様にになります。

Array
(
    [name] => salumarine
    [site] => https://salumarine.com/
    [address] => Array
        (
            [city] => Seattle
            [state] => WA
            [zip] => 98102
        )

)
stdClass Object
(
    [name] => さるまりん
    [site] => https://salumarine.com/
    [address] => stdClass Object
        (
            [city] => シアトル
            [state] => ワシントン州
            [zip] => 98102
        )

)

改行が含まれていますね。

ログファイルの中でこの状態だと探しにくいのでこれを一行のJSON文字列で表示したい。

json_encode()を使います。

こんな風にします。

echo json_encode($ary, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n";
echo json_encode($obj, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n";

表示される文字列はこうなります。

{"name":"salumarine","site":"https://salumarine.com/","address":{"city":"Seattle","state":"WA","zip":"98102"}}
{"name":"さるまりん","site":"https://salumarine.com/","address":{"city":"シアトル","state":"ワシントン州","zip":"98102"}}

一行で読みやすくなりましたね。

json_encode()にオプションを指定していますがなければこんな感じになります。

{"name":"salumarine","site":"https:\/\/salumarine.com\/","address":{"city":"Seattle","state":"WA","zip":"98102"}}
{"name":"\u3055\u308b\u307e\u308a\u3093","site":"https:\/\/salumarine.com\/","address":{"city":"\u30b7\u30a2\u30c8\u30eb","state":"\u30ef\u30b7\u30f3\u30c8\u30f3\u5dde","zip":"98102"}}

アルファベットや数字は良いのですが、マルチバイト文字がエンコードされていますね。スラッシュも。
これでは読みにくい。
まずはJSON_UNESCAPED_SLASHESはスラッシュをエンコードしない様に、次にマルチバイトをエンコードしないようにJSON_UNESCAPED_UNICODEを指定しています。

これでログファイルに吐き出されてもgrep等で目的のデータを探しやすくなります。

まとめです。配列やオブジェクトを1行のJSONにするには

json_encode([配列orオブジェクト], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)

です。

問題が起こった時に調査が簡単なのがいいですよね。
工夫して自分を楽にしていきたいです。

読んでくださってありがとうございました。

それではまた!