在我看来,常量JSON_BIGINT_AS_STRING
已从PHP 5.5中的json_decode()
中删除。
我使用PHP“5.5.3-1ubuntu2”(Ubuntu 13.10)并且自从PHP 5.4(Ubuntu 13.04)更新后出现此错误:
警告:json_decode():选项JSON_BIGINT_AS_STRING未在...中实现
有没有证据表明这已被删除?
编辑:
我不需要那个功能所以我添加了这个常量:
define('USE_JSON_BIGINT_AS_STRING',(!version_compare(PHP_VERSION,'5.5', '>=') and defined('JSON_BIGINT_AS_STRING')));
无论我在哪里使用json_decode(),我都会使用:
if(USE_JSON_BIGINT_AS_STRING) $j= json_decode($json ,true, 512, JSON_BIGINT_AS_STRING );
else $j= json_decode($json,true );
答案 0 :(得分:9)
如前所述,此错误似乎来自pecl-json-c的错误版本,由于许可问题,Ubuntu作为php5-json的别名打包。
由于firebase/php-jwt项目,我找到的解决办法是检查由pecl-json-c而不是JSON_C_VERSION
设置的USE_JSON_BIGINT_AS_STRING
常量。 (由于USE_JSON_BIGINT_AS_STRING
已定义,但尚未实施。
以下是JWT project的代码:
<?php
if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
/** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you
* to specify that large ints (like Steam Transaction IDs) should be treated as
* strings, rather than the PHP default behaviour of converting them to floats.
*/
$obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
} else {
/** Not all servers will support that, however, so for older versions we must
* manually detect large ints in the JSON string and quote them (thus converting
*them to strings) before decoding, hence the preg_replace() call.
*/
$max_int_length = strlen((string) PHP_INT_MAX) - 1;
$json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);
$obj = json_decode($json_without_bigints);
}
答案 1 :(得分:4)
由于LICENSE问题而您使用受影响的introduced,因此某些Linux发行版的json-c PECL module似乎是{{3}}。
我的建议是使用较新版本的模块。