-->

2010-04-10

php の json_decode のエラー

json_decode でエラーが出るので調べたところ、下記のように記述すると解決しました。
バックスペース(\x08): \b
水平タブ      (\x09): \t
改ページ      (\x0C): \f

以下は詳細です。

json_last_error() は php-5.3 で使えるので、無い場合、適当な場所にインストールします。
$ ./configure --prefix=/usr/local/stow/php-5.3.2 --disable-cgi --disable-all --enable-json
$ make
$ sudo make install

エラーの出る(json_decode() が NULL を返す)プログラムに json_last_error() を追加します。
$ lv /tmp/test.php
...
var_dump(json_decode($buf));
var_dump(json_last_error());
$arr = get_defined_constants(true);
var_dump($arr["json"]);
...

json_last_error() が JSON_ERROR_CTRL_CHAR でした。
$ /usr/local/stow/php-5.3.2/bin/php /tmp/test.php | lv
...
NULL
int(3)
array(10) {
  ["JSON_HEX_TAG"]=>
  int(1)
  ["JSON_HEX_AMP"]=>
  int(2)
  ["JSON_HEX_APOS"]=>
  int(4)
  ["JSON_HEX_QUOT"]=>
  int(8)
  ["JSON_FORCE_OBJECT"]=>
  int(16)
  ["JSON_ERROR_NONE"]=>
  int(0)
  ["JSON_ERROR_DEPTH"]=>
  int(1)
  ["JSON_ERROR_STATE_MISMATCH"]=>
  int(2)
  ["JSON_ERROR_CTRL_CHAR"]=>
  int(3)
  ["JSON_ERROR_SYNTAX"]=>
  int(4)
}

$buf を最小限にしてテストしたところ、バックスペース、水平タブ、改ページ、が、そのまま書かれていることが原因でした。

0 件のコメント: