こんにちは、Ryohei(@ityryohei)です!

本記事では、PHPでjson_decode()した結果「NULL」になった際に、解消するまでに試したことをご紹介しています。

「NULL」を返す原因はぞれぞれ異なると思いますので、こんなケースもあるんだな~くらいに見ていただいて、もし同じ方法で解決する内容であれば、私としてはうれしい限りです!

では、解説していきます。

json_decode()するとnullになる?

今回発生したケースになります。

外部のURLのJSONを取得し、取得した結果をダンプしてみます。内容を確認するつもりでダンプしているため、JSONを取得した後にやるべきことを頭の中でまとめながらブラウザの更新ボタンをぽちっとクリック。

$json = json_decode($url);
var_dump($json)

すると。

実行結果

NULL

ん? 「NULL」?

最近仕事でプロブラムばかり書いて目が疲れているのかもしれません。URLにアクセスしてJSONファイルがブラウザ上で表示されることを確認し、再度ブラウザの更新ボタンをクリックします。

実行結果

NULL

しかし、ブラウザには憎き「NULL」の文字が鎮座しています。何度更新しても「NULL」の文字が表示されます。

え、なんで「NULL」?

再度、ソースを見直します。ただ単に引数の指定が足りないだけかもしれません。

$json = json_decode($url);
var_dump($json)

あ、第二引数指定するの忘れてる……。

これが原因に違いない! とソースを下記の用に修正します。

$json = json_decode($url, true);
var_dump($json)

そして自信満々にブラウザの更新ボタンをクリックします。(実際には「F5」を押下しています。)

が。

実行結果

NULL

実行結果は変わりません。何回か「F5」を押下してみましたが、何度やっても「NULL」「NULL」「NULL」「NULL」「NULL」です。

しょうがないので、次の手を打ってみます。

JSONのエラーメッセージを確認する

PHPには便利な関数が用意されていて、直近で実行された「json_encode()」や「json_decode()」のエラーメッセージを表示することができるものがあります。json_last_error_msgです。(リンク先は「PHP.net」です。)

エラーメッセージを見れば何かわかるかもしれない。先ほどのソースに一行追加して、ブラウザの更新ボタンをクリックします。

$json = json_decode($url, true);
echo json_last_error_msg();

実行結果

Syntax error

小さい文字で控えめに「Syntax error」と教えてくれてます。かしこくて素敵! と褒めたいところですが、困ったことに……このJSON、私の方で手を加えることはできません。別の開発会社がサーバーもファイルも管理しています。急ぎの仕事なので今から連絡して待つ、という時間はありません。

で、ふと少し前に同じJSONを使用して作成したサイトを見に行きます。ブラウザで新しいタブを開いてURLを叩きます。なんと、そのサイトではうまく情報を取ることができているではありませんか。

試しに問題のJSONをまじまじと見てみます。JSONはエンコードされた状態で提供されています。

問題のJSONさんの中身

下記は問題となっているJSONファイルの中身の抜粋です。キーや値は変更しています。

"[
    {
        \"id\":\"123\",
        \"name\":\"abc\",
        \"created_at\":\"2019-10-24 21:00:00\"
    },
    {
        \"id\":\"456\",
        \"name\":\"def\",
        \"created_at\":\"2019-10-24 22:00:00\"
    }
]"

何やら「バックスラッシュ(もしくは円マーク)」が大量に書き込まれています。エスケープ文字ですね。

もしかして、JSONの値にエスケープ文字が含まれているのが原因かもしれない!

エスケープ文字を取り除いてデコードしてみる

PHPでスラッシュを取り除くことができる「stripslashes」という関数を通して、再度確認してみることにします。

$json = json_decode(stripslashes($url), true);
var_dump($json)

気になる実行結果は。

実行結果

string(xxx) "[{"id":"123","name":"abc","created_at":"2019-10-24 21:00:00"}{"id":"456","name":"def","created_at":"2019-10-24 22:00:00"}]"

ようやくJSONを正常に取得することができました。エスケープ文字が原因で「Syntax error」が発生していたんですね。とりあえず原因がわかってすっきりです!

開発元に今回のケースを伝えて、私は私で実装を進めていきます。

最後に

いかがでしたでしょうか。

今回のようなケースはあまりないかと思いますが「json_decode()」の結果が「NULL」になる場合、一つ一つ確認していくことで原因を解消することができます。焦らずに一つ一つ原因を確かめることが、結局一番早い近道かもしれないですね。

以上、PHPでjson_decode()がnullを返す?解消するまでに試したことのご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。