No.247


【PHP】JSONがnullになるケース

いきなりjson_decodeがnullになってしまった…

 あるFTPされてくるjsonデータを処理するバッチがいきなり止まるようになってしまった。
 それもローカルやAWSのElastick Beanstalk環境では問題がなく、なぜかCircleCI環境のテスト時だけエラーになって停止する。

 原因を調べてみると、jsonの書式がルール違反でCircleCI環境のPHPではデコード失敗し、nullとして扱われていることが原因だった。

 というわけで、気がついた事象を備忘録がてらメモ。


PHPのバージョン?

 jsonがデコードできているPHPバージョンは5.6.16。OSはCentOS。
 デコードできなかったCircleCIのPHPバージョンは5.6.17。OSはubuntu。

 Changelogにはそれっぽい内容は書いてない。謎。


原因①:jsonデータにBOMがついている?

 BOMがついてると失敗するというのは既知の情報なのでまずこれを削除。取る方法は下記などお好みで。

$hoge = ltrim($hoge, "\xEF\xBB\xBF");

 後でデータを確かめてみたら今回はこれが原因ではなかった。


原因②:jsonデータのスラッシュがエスケープされていないから?

 データを眺めているとjsonに含まれているurlがエスケープされていなかった。

http://www.hoge.com/

 となっているので

http:\/\/www.hoge.com\/

 としてみたが変化無し。


原因③:jsonデータをインデントして見やすくしている

 これが原因だった。

 本来のjsonデータを

{"foo":1,"var":2}

 下記のように書いていたのだ。

    {
       "foo":1,
       "var":2
    }

 こんな書き方はじめてみたよ… orz


余談

 BOM付きということと謎のインデントがあることからおそるおそる聞いてみたら、毎回担当者が手作業でエディタで作成しているとのこと。てっきりシステムが自動作成していると思っていた。

 今までの人は秀丸で作成していたそうだが、今回人事異動で担当者が変わってWindowsのnotepad(メモ帳)を使って作成していたそうだ。びっくり。