我正在尝试解码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():检测到整数溢出
答案 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 允许将大整数转换为字符串而不是默认的浮点数。