Подтвердить что ты не робот

JSON_BIGINT_AS_STRING удалено в php 5.5?

Мне кажется, что константа 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 не реализована в...

Есть ли какие-либо доказательства того, что это было удалено?


EDIT:

Мне не нужна эта функция, поэтому я добавил эту константу:

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 );
4b9b3361

Ответ 1

Как уже упоминалось здесь, эта ошибка, похоже, исходит из ошибочной версии 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);
}

Ответ 2

Похоже, что это было представлено для некоторых дистрибутивов Linux из-за проблем с LICENSE, и вы используете уязвимый json-c PECL module.

Мое предложение состояло в том, чтобы использовать более новую версию модуля.