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

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

以前、配列やオブジェクトを一行のJSON文字列にする方法というのを書きました。

これでうまくいかないケースがあったので、再度チャレンジです。

オブジェトが複雑だとできないのかなんなのか。
まずはオブジェクトから配列に、それからJSON文字列にと二段階でやっています。

まずは一段階目、オブジェクトから配列に。

これが今回の肝です。これをするために次のような関数を書きました。

o2a()、object to array、「オブジェクトから配列に」です。

function o2a($o) {
    if ((! is_array($o)) and (! is_object($o)))
        return $o;

    $result = [];

    $o = (array) $o;
    foreach ($o as $key => $value) {
        if (is_object($value))
            $value = (array) $value;
        if (is_array($value))
            $result[$key] = o2a($value);
        else
            $result[$key] = $value;
        }
    return $result;
}

これ上でできた配列を、a2j()、array to json、「配列からJSONに」に食わせます。

function a2j($a) {
    return json_encode($a, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
}

これは以前書かせてもらた記事でやった方法です。

この二つを組み合わせて、

o2j()、object to json、「オブジェクトからJSONに」にしています。

function o2j($o) : string {
    if (is_object($o)) {
        $o = o2a($o);
    }
    return a2j($o);
}

関数o2j()は引数が配列でもオブジェクトでも構いません。

以前と同じ配列とオブジェクトをこの関数で読んで文字列にしたいと思います。

$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;

echo o2j($ary) . "\n";
echo o2j($obj) . "\n";

実行するとこんなふうになります。

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

同じことなのですが、これで複雑なオブジェクトでも内容を表示できるようになります。
うまくいかないことがあったらこの改善版を試してみるといいかもです。

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

それではまた!