技術系TIPS
PR

【PHP】json_endodeの関数でJSONの空オブジェクトを表現させる

saratogax
記事内に商品プロモーションを含む場合があります

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 のオプションも不要なので、意図していない変換がされてしまう心配もないですね。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました