如何忽略 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 允许将大整数转换为字符串而不是默认的浮点数。
我试图在 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 允许将大整数转换为字符串而不是默认的浮点数。