PHPでWebAPIを叩き、取得したJSONデータを連想配列に変換して扱うといったプログラムを書いていた時のこと。

APIからJSONデータを取得するところまでは難なくいけたのだが、json_decode関数で変換するとint(1)しか結果が返ってこない問題が発生した。

<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => $url,
  CURLOPT_CUSTOMREQUEST => $method,
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_POSTFIELDS => http_build_query([
    'key1' => 'value1',
    'key2' => 'value2',
  ]),
]);

$response = curl_exec($curl);
$result = json_decode($response, true);
var_dump($result); // int(1)と表示されるだけでデコードされない

curl_close($curl);

色々調べたところ、StackOverflowのある記事にたどり着いた。

https://stackoverflow.com/questions/37811377/php-json-decode-returns-int1

解決方法

CURLのオプション「CURLOPT_RETURNTRANSFER」にtrueを指定する必要があるとのことだった。

先程のコードを改変し、curl_setopt_array関数内を以下のとおり修正した。

curl_setopt_array($curl, [
  CURLOPT_URL => $url,
  CURLOPT_CUSTOMREQUEST => $method,
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_RETURNTRANSFER => true, // 追加
  CURLOPT_POSTFIELDS => http_build_query([
    'key1' => 'value1',
    'key2' => 'value2',
  ]),
]);

デフォルトでcurl_execの結果は成功か失敗かしか返さないようで、このオプションにtrueを指定するとJSON形式の結果を取得することができる。

これでjson_decode関数を実行すると、JSONデータを連想配列として扱えるようになる。