Guzzleで空配列のパラメータをオブジェクトとして送る方法

GuzzleでJSONをリクエストボディにセットしてPOSTリクエストを送る際、空配列のパラメータは空配列としてJSONに変換される。これはPHPの仕様として仕方ない部分がある。
しかし、空のオブジェクト {} として変換したい場合もある。

例えば弊社で作っているPrintgraphのAPIでは、params というリクエストボディのJSONパラメータを利用者自身が管理画面から自由にオブジェクトの構造を定義できるようになっている。
そのため { "params": { "name": "hoge" }} という形でnameプロパティを定義する人もいれば、何も定義せず { "params": {} } とする人も存在する。

問題点

この空のparamsの値をPHPで扱おうとするとちょっと厄介だ。 PHPでは空の連想配列をJSONに変換すると、空の配列 [] という形のJSON配列に変換されてしまう。

1
2
// PHPの動作例
json_encode([]);  // "[]" になる(配列)

しかし、PHPの連想配列はJavaScriptのobjectのように扱うことが多いため、空のオブジェクト {} に変換したい場合がある。

解決方法

空の配列の場合は stdClass のインスタンスをセットすることで、空のオブジェクト {} としてJSONエンコードされる。

1
2
// stdClassを使った場合
json_encode(new \stdClass());  // "{}" になる(オブジェクト)

実際のGuzzleでの使用例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
return $this->client->request('POST', 'pdf/generate', [
    'json' => [
        'templateId' => $generateRequest->templateId,
        // paramsが空の場合はstdClassをセット
        'params' => empty($generateRequest->params) ? new \stdClass() : $generateRequest->params,
        'format' => $generateRequest->format,
    ],
    'headers' => [
        'Accept' => ['application/pdf', 'application/json'],
    ],
]);

このようにすることで、params が空の場合でも [] ではなく {} としてJSONエンコードされ、API側で期待通りのオブジェクト形式で受け取ることができる。

まとめ

  • PHPの空配列 []json_encode()[] に変換される
  • 空のオブジェクト {} として送りたい場合は new \stdClass() を使用する
  • Guzzleの json オプションでも同様に stdClass が有効

カテゴリ

comments powered by Disqus