【PHP・Laravel】json_decode()がNULLを返したので、原因を特定して解消

技術メモ

LaraveでAPIを作成して、そのAPIに下記のJSON形式のデータをpostしました。

その時にjson_decode関数でデコードした際にNULLを返したので、原因を特定して解消しました。

 

postしたJSON形式のデータ

{
"userId": "12345",
"name": "Sato",
"guitar": "Fender",
"type": "Stratocaster"
}

 

【結論】リクエストのボディ部分のみをjson_decodeする

結論から言うと、受け取ったデータのうち、ボディ部分のみをjson_decode関数を使用してデコードすることで解決しました。

 

$data = json_decode(file_get_contents('php://input'), true);

 

file_get_contentsでファイルの内容を全て文字列に読み込みます。

また、php://inputを指定する事で、リクエストの body 部から生のデータを読み込むことができます。

 

 

var_dump($data)すると、

array (size=4)
  'userId' => string '12345' (length=5)
  'name' => string 'Sato' (length=4)
  'guitar' => string 'Fender' (length=6)
  'type' => string 'Stratocaster' (length=12)

このように連想配列にパースしたオブジェクトを返してくれます。

 

 

ちなみに第二引数にtrueを指定しない場合($data = json_decode(file_get_contents('php://input'));)、

var_dump($data)すると、

object(stdClass)[269]
  public 'userId' => string '12345' (length=5)
  public 'name' => string 'Sato' (length=4)
  public 'guitar' => string 'Fender' (length=6)
  public 'type' => string 'Stratocaster' (length=12)

このようになります。

 

単純に json_decode($request) すると、Syntax errorになる

POSTで受け取ったデータ(Request $request)をそのままjson_decodeに入れてもSyntax errorとなるため、NULLを返します。

 

json_decode($request);
return json_last_error_msg();

→Syntax error

json_last_error_msg()は、直近の json_encode() や json_decode() の呼び出しのエラー文字列を返します。

 

つまり構文エラーを起こしていることがわかります。

 

json_decode($request)だとbody部以外の余計なデータも含まれてしまう

POSTで受け取ったデータには、body部以外に様々な情報が含まれています。

var_dump($request)するとわかりますが、

object(Illuminate\Http\Request)[51]
  protected 'json' => 
    object(Symfony\Component\HttpFoundation\ParameterBag)[43]
      protected 'parameters' => 
        array (size=4)
          'userId' => string '12345' (length=5)
          'name' => string 'Sato' (length=4)
          'guitar' => string 'Fender' (length=6)
          'type' => string 'Stratocaster' (length=12)
  protected 'convertedFiles' => null
  protected 'userResolver' => 
    object(Closure)[31]
      public 'static' => 
        array (size=1)
          'app' => 
            object(Illuminate\Foundation\Application)[2]
              ...
      public 'this' => 
        object(Illuminate\Auth\AuthServiceProvider)[47]
          protected 'app' => 
            object(Illuminate\Foundation\Application)[2]
              ...
      public 'parameter' => 
        array (size=1)
          '$guard' => string '<optional>' (length=10)
  protected 'routeResolver' => 
    object(Closure)[229]
      public 'static' => 
        array (size=1)
          'route' => 
            object(Illuminate\Routing\Route)[199]
              ...
      public 'this' => 
        object(Illuminate\Routing\Router)[34]
          protected 'events' => 
            object(Illuminate\Events\Dispatcher)[35]
              ...
          protected 'container' => 
            object(Illuminate\Foundation\Application)[2]
              ...
          protected 'routes' => 
            object(Illuminate\Routing\RouteCollection)[37]
              ...
          protected 'current' => 
            object(Illuminate\Routing\Route)[199]
              ...
          protected 'currentRequest' => 
            &object(Illuminate\Http\Request)[51]
          protected 'middleware' => 
            array (size=10)
              ...
          protected 'middlewareGroups' => 
            array (size=2)
              ...
          public 'middlewarePriority' => 
            array (size=7)
              ...
          protected 'binders' => 
            array (size=0)
              ...

このようにbody部以外にもさまざまな情報があることがわかります。

 

なので、そのままjson_decode($request)をしても、うまくデコードできずにSyntax errorとなってしまいます。

 

 

しかし、file_get_contents('php://input')を利用する事で

'{"userId": "12345","name": "Sato","guitar": "Fender","type": "Stratocaster"}' (length=76)

このようにbody部のみ(JSON形式)を取り出す事ができるので、json_decode()を利用する事が可能になります。

 

 

技術メモ
スポンサーリンク
スポンサーリンク
のすけをフォローする
やばブロ!

コメント