PHPのjson_encode()で数値が文字列扱いになる場合

web apiなどでデータのやり取りにjsonを使っている場合、json_encodeをよく使うと思います。
ある時、なぜかデータはうまくわたってきているのにjavascript側でうまく動かないことがありました。

PHPの変数の方の扱いは超いい加減

原因は、数値データが文字列としてわたってきた場合。
PHPは、変数の型の管理がかなりいい加減なので、数値データがいつの間にか文字列として扱われてしまう場合があり、この影響で文字列として認識されてしまったのが原因でした。

対処方法は2つあります。

明示的に型をキャストしてから渡す

値をコピーするときに変数の型を付けてやることで明示的に型を指定することができます。

$hoge = (int)$source;
json_encode($hoge);

いちいち配列をなめてキャストしなおさなければならないのがネックです。

JSON_NUMERIC_CHECKオプションを指定する

json_encodeの第2引数にJSON_NUMERIC_CHECKを付けることで、数値っぽいデータの場合は数値にキャストされます。

json_encode($source,JSON_NUMERIC_CHECK);

ただしこれには問題があって、”数値っぽい”ものは問答無用で変換されてしまうため、例えば、APIキーとかでランダムな文字列を渡したい場合、文字列で渡さなければならないのに勝手に数値に変換されてとんでもないことになる可能性があります。
よって、同じカラムでも内容によって、数値にキャストされたりされなかったりということがありうるので、非常に面倒なバグを生む可能性があります。
できるだけ、型をキャストする方法を使ったほうが良いかと思います。

タイトルとURLをコピーしました