【PHP】json_endodeの関数でJSONの空オブジェクトを表現させる
GooglePlay の「REST Resource: purchases.subscriptionsv2」 API のレスポンス仕様で以下のオブジェクトがあった。
(一部抜粋)
{
"autoRenewingPlan": {
"autoRenewEnabled": boolean,
"priceChangeDetails": {
object
},
"installmentDetails": {
object
}
}
}
この構造、autoRenewEnabled が true の時は上記のような構成になっているのですが、false に該当する時は以下の構造になります。
{
"autoRenewingPlan": {}
}
これを php で表現しようとすると空配列を定義することになりますよね。
$json = [
"autoRenewingPlan" => [],
];
しかし、これだと json_encode の結果が空配列になってしまいます。
{“autoRenewingPlan”:[]}
今回は、この問題を解決して空のオブジェクトを返せるようにしてみましょう。
JSON_FORCE_OBJECTで配列のオブジェクトを返す
json_encode には 2 番目の引数でオプションを指定することができます。
その中に、「JSON_FORCE_OBJECT」というオプションがあります。
非連想配列を使用した場合に、配列ではなくオブジェクトを出力します。 出力を受け取る側がオブジェクトを期待しており、配列が空っぽである場合などに特に便利です。
https://www.php.net/manual/ja/json.constants.php#constant.json-force-object
これを使えば解決しそうですね。
$json = [
"autoRenewingPlan" => [],
];
echo json_encode($json, JSON_FORCE_OBJECT) . PHP_EOL;
って思ったのですが、以下の記事で問題点が指摘されていました。
どうやら他の配列項目もオブジェクトに変換してしまうようです。
確かに、以下のような配列を json_encode すると問題点がわかりますね。
連想配列ならいいのですが、単なる配列だとインデックスの部分も考慮されちゃうのか。
$json = [
"autoRenewingPlan" => [],
"test" => [1, 2, 3],
];
echo json_encode($json, JSON_FORCE_OBJECT) . PHP_EOL;
{“autoRenewingPlan”:{},”test”:{“0″:1,”1″:2,”2”:3}}
stdClassで代用する
ちょうど上記の記事に書かれていたのですが、空オブジェクトは stdClass で対応が可能なようです。
$json = [
"autoRenewingPlan" => new stdClass(),
];
echo json_encode($json) . PHP_EOL;
これの結果は以下のようになります。
{“autoRenewingPlan”:{}}
JSON_FORCE_OBJECT のオプションも不要なので、意図していない変換がされてしまう心配もないですね。