如何忽略 PHP Notice: json_decode(): Yii 中检测到整数溢出?

How do I ignore PHP Notice: json_decode(): integer overflow detected in Yii?

我试图在 JSON 中解码一个长整数,但它总是崩溃并在 Yii 中给出错误。我已经使用了 JSON_BIGINT_AS_STRING 选项。如何绕过或忽略此错误?

php > var_dump( json_decode('[66933258,"B009GQ034C",281441845828]', false, 512, JSON_BIGINT_AS_STRING));
PHP Notice:  json_decode(): integer overflow detected in php shell code on line 1
array(3) {
  [0]=>
  int(66933258)
  [1]=>
  string(10) "B009GQ034C"
  [2]=>
  string(19) "9223372036854775807"
}

在应用程序中,它给出

PHP Notice – yii\base\ErrorException json_decode(): integer overflow detected

用try/catch语句包围来拦截异常。选择要捕获的适当异常并防止类似异常误报的更多要点。

刚试过你的代码,在我的机器上运行完美,也许这与你的 php 版本有关?

我唯一能想到的是(如果你不需要数字值,而只是值)首先使用 preg_replace 到 "escape" 数字作为字符串:

$json = '[66933258,"B009GQ034C",281441845828]'; 
var_dump(json_decode(preg_replace('/(\W)(\d+)(\W)/', '\1"\2"\3', $json)));

会产生这个:

array (size=3)
  0 => string '66933258' (length=8)
  1 => string 'B009GQ034C' (length=10)
  2 => string '281441845828' (length=12)

编辑:

现在我看得更仔细了:您实际上是在命令行上获取一个值。所以 JSON_BIGINT_AS_STRING 工作正常。问题是 json_decode()-函数似乎在切换到此行为之前生成了一个通知。 Yii 的错误处理程序默认捕获通知并将其转换为异常。

在这种情况下,解决方案可能很简单:

var_dump(@json_decode('[66933258,"B009GQ034C",281441845828]', false, 512, JSON_BIGINT_AS_STRING));

我通常建议不要使用 silence 运算符,因为它会掩盖错误,但在这种情况下,它胜过替代方法(禁用捕获通知并可能遗漏其他错误)

您可以将 json_decode() 与深度 [512] 和选项 [JSON_BIGINT_AS_STRING] 一起用于大整数:

<?php
    $json = '{"number": 12345678901234567890}';

    $jsonArray = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);

    $jsonObject = json_decode($json, false, 512, JSON_BIGINT_AS_STRING);

    print_r($jsonArray);
?>

JSON_BIGINT_AS_STRING 允许将大整数转换为字符串而不是默认的浮点数。