突然ですが、次のような配列をJSONエンコードしたい場合どうしましょう。
<?php
$json = ['hoge' => []];
簡単ですね。json_encodeを使えば次のような結果になるでしょう。
var_dump(json_encode($json));
// output:
// string(11) "{"hoge":[]}"
ただしこの際、空配列は[]
として表現されています。これを空オブジェクトとして表現したい場合についてです。
JSON Objectの[]と{}
そもそものJSON Objectの[]
と{}
についてです。Difference between { and [ when formatting JSON object - stack overflow にて解説がありますが、一見形が似ているこの2つは、もちろん異なるものです。
[]
は、Arrayとしての扱いです。例えば次のようなJSON文字列は、Ford・BMW・Fiatという三要素を持った配列ということになります。
[ "Ford", "BMW", "Fiat" ]
{}
は、Objectとしての扱いです。例えば次のようなJSON文字列は、key-valueの組み合わせで表現されたオブジェクトということになります。
{ "name":"John", "age":30, "car":null }
空配列を空オブジェクトとしてエンコード
冒頭見たようなPHPの空配列を、JSONの空オブジェクトとしてエンコードする場合は、JSON_FORCE_OBJECT
というオプションを用います。
<?php
$json = ['hoge' => []];
var_dump(json_encode($json, JSON_FORCE_OBJECT));
// output:
// string(11) "{"hoge":{}}"
{}
として表現することができました。
JSON_FORCE_OBJECTの注意
PHPの配列を安全にJSONシリアライズするという記事にて言及していただいていますが、JSON_FORCE_OBJECT
は中の要素も再帰的にオブジェクトになってしまうよう。例えば、次のような三階層の連想配列をJSONエンコードした場合こうなります。
<?php
$json = ['hoge' => ['huga' => ['piyo' => 'aaa']]];
var_dump(json_encode($json, JSON_FORCE_OBJECT));
// output:
// string(32) "{"hoge":{"huga":{"piyo":"aaa"}}}"
場合によっては、そこまでしてほしくないんやということもありそうなので、用途に応じて使わないといけなそうですね。
以上。