12

在我看来,该常量JSON_BIGINT_AS_STRING已从json_decode()PHP 5.5 中删除。

我使用 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 );
4

2 回答 2

9

如前所述,此错误似乎来自 pecl-json-c 的错误版本,由于许可问题,Ubuntu 将其打包为 php5-json 的别名。

感谢firebase/php-jwt项目,我发现的一个解决方法是检查JSON_C_VERSION由 pecl-json-c 设置的常量,而不是USE_JSON_BIGINT_AS_STRING. (由于USE_JSON_BIGINT_AS_STRING已定义,但未实现)。

这是来自JWT 项目的代码:

<?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);
}
于 2015-01-12T20:06:03.400 回答
4

由于 LICENSE 问题,这似乎被引入某些 Linux 发行版,并且您正在使用受影响的json-c PECL 模块

我的建议是使用更新版本的模块。

于 2013-10-22T15:07:31.237 回答