2015年6月9日火曜日

json_decodeをする際になぜかエラーが発生してちゃんとデコードしてくれない的なお話

  • このエントリーをはてなブックマークに追加

jsonは何かと便利だったりする。
特にjsとの親和性もそうだけど、phpでもオブジェクトにしたり連想配列にしたり、
むしろデータ的に検索されないでかつ配列の長さが不定のものをmysqlに入れるなんてのはすごく便利。
json_encodeしたものを入れて、取り出してjson_decodeして使うなんていうことも。

けど今回はなぜかデータベースに入れたjsonを取り出して、デコードして使おうにもデコードがうまくいかない。
どうして使えないのかを探ってみたのでそのお話をば。

■json関連のエラーの出し方

$json; //mysqlから引っ張って来たデータ

$ary = json_decode($json,true);
echo json_last_error(); //①
echo json_last_error_msg();  //②
もしエラーがあればjson_last_error()で1〜5のエラーが出るので、上の画像と照らし合わせて判断。
またjson_last_error_msg()でjson_last_error()とは違うエラーメッセージを出せるっぽいのでついでに出しておくみたいな。

で、自分の方では①の場合は4(JSON_ERROR_SYNTAX)であり、
②の場合はquoted object property name expectedであった。

とはいっても構文エラーといっても入ってるデータを検証しても特段おかしいところはなかったり、
jsonの中身をコピペしてjson_decode()したらOKだったりした。

ちなみに②のメッセージで出て来たquoted object property name expectedはよくわからなかったりする。

■そもそもjson_decodeできなかった原因

とりあえずjsonを扱えるのはそもそもUTF8環境下であることを思い出したので、
DBの文字エンコーディングを見てみたけどそもそもUTF-8であった。
で、まぁ後は取り出した文字がUTF-8じゃないということも考えられるので、
なんとなしにmb_detect_encoding()で取り出したデータの文字コードを見てみたらSJISだったっていう。

とりあえずよくわからないけどなぜか取り出したらSJISだったからデコードできなかったっていう。
というわけでそもそもちゃんとUTF-8で扱ってるかとかもちゃんと試してみないとなぁと思った。

って思ったけどmb_detect_encoding()の第二引数にautoを付けるとphp.iniでdetectに指定している文字列以外も出るわけで。
それで見てみたらASCIIとなっておりそもそもの原因は文字コードではなかったっていう。

とりあえず原因はよくわからないけど色々と調べていったら下記の方法でどうにか解決出来た
参考リンク

$ary = json_decode(str_replace('"','"',$json),true);
とりあえず"とエンコードされた文字列があるのが原因っぽいような感じと見受けられる。
なんていうかよくわからないけど致命的ななんちゃらみたいな。

ってことでどうにかこれでちゃんと問題なくjson_decode出来るのでよかった的な。

Adsense