かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP json_decode がnullになるにハマる

PHPjson_decodeは値が " (ダブルコーテーションで)囲まれていないと null になるっぽい。

json_decode() でnull になるJSONのパターン

1. " で囲われていない値がある

json = {1: "星宮いちご"}
<?php
json_decode( json ); // => NULL

2. 値が ' (シングルコーテーション)で囲まれている

json = {"1": '<b class="idol">星宮いちご</b>'}
<?php
json_decode( json ); // => NULL

` ←コレもダメ

json = {"1": `星宮いちご`}
<?php
json_decode( json ); // => NULL

3. 行末に , がある

json = {"1": "星宮いちご",}
<?php
json_decode( json ); // => NULL

すべてのキーと値が " で囲まれていて、最後に不要な , もない場合ならOK

json = '{"1": "星宮いちご"}';
<?php
json_decode( json );
// => object  { ["1"]=> string(15) "星宮いちご" }
json_decode( json, true );
// => array(1) { [1]=> string(15) "星宮いちご" }

"で囲まれた値の中で'が使われているのはOK。
例えばHTMLタグを入れるような場合、値となる文字列は " で囲み、属性は'で囲めば大丈夫

json = ["<b class='idol'>星宮いちご</b>", "霧矢あおい", "紫吹蘭"];
<?php
json_decode( json );
// => array(3)  { [0]=> string(35) "<b class='idol'>星宮いちご</b>" [1]=> string(15) "霧矢あおい" [2]=> string(9) "紫吹蘭" }
json_decode( json, true );
// => array(3)  { [0]=> string(35) "<b class='idol'>星宮いちご</b>" [1]=> string(15) "霧矢あおい" [2]=> string(9) "紫吹蘭" }

PHP上の文字列でJSONを作る場合は全体を'で囲むか、値を囲む"エスケープすればOK (最初からObjectや配列作れば良くね?需要あるのか謎だけど...)

<?php
$json = '{"みくるの": "みらくる!"}';
json_decode( $json );
// => object  { ["みくるの"]=> string(15) "ミラクル!" }
$json = "{\"みくるの\": \"ミラクル!\"}";
json_decode( $json );
// => object  { ["みくるの"]=> string(15) "ミラクル!" }

 
javascriptだと問題ないようなjsonPHPjson_decode()だとnull になって少しハマりました。
PHPのバージョンが上がって解消されるといいな...


[参考]