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

时间:2015-05-13 17:12:48

标签: php json yii yii2

我正在尝试解码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注意 - yii \ base \ ErrorException   json_decode():检测到整数溢出

3 个答案:

答案 0 :(得分:4)

刚试过你的代码并且在我的机器上它运行得很好,也许它与你的php版本有关吗?

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

$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));

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

答案 1 :(得分:0)

使用try / catch语句环绕拦截异常。选择适当的异常以捕获更多的点,并防止类似异常的误报。

答案 2 :(得分:-1)

你可以使用深度[512]的json_decode()和大整数的选项[JSON_BIGINT_AS_STRING]:

class.java.simpleName

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