1

我遇到了使用 json_decode 解码大 int 的典型问题,并尝试使用JSON_BIGINT_AS_STRING选项,但似乎 php 忽略了该参数。

我尝试了 php.net 示例代码:

$json = '12345678901234567890';

var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));

输出应该是:

float(1.2345678901235E+19)
string(20) "12345678901234567890"

但是在我的服务器(xampp php 5.4.7)中,我有:

float(1.2345678901235E+19)
float(1.2345678901235E+19)

谢谢您的帮助!

4

1 回答 1

1

编辑:

我必须确认这一点,但这种行为已被归类为 PHP 中的错误。有关更多详细信息,请参阅错误报告

现有行为会导致您的字符串在PHP 内部被转换为 int/float(数字类型)。如果您提供 JSON 编码的对象、数组或字符串,该函数会执行它所描述的操作,但现在这反映了错误的行为。

$json = '12345678901234567890';

var_dump(json_decode($json));           /* float(1.2345678901235E+19) */
var_dump(json_decode($json, false, 512, 
         JSON_BIGINT_AS_STRING));       /* float(1.2345678901235E+19) */

如您所见,两者都给了我们一个浮点数,但是当我们使用有效的 JSON 对象、数组或有效的 JSON 作为字符串时,我们会得到预期的结果。

$jsonStr = '"12345678901234567890"';        // as a string
$jsonArr = '[12345678901234567890]';        // as an array
$jsonObj = '{"num":12345678901234567890}';  // as an object

var_dump(
         json_decode($jsonStr), /* It's JSON_BIGINT_AS_STRING by default in 5.4 */
         json_decode($jsonArr),
         json_decode($jsonArr, false, 512, JSON_BIGINT_AS_STRING),
         json_decode($jsonObj),
         json_decode($jsonObj, false, 512, JSON_BIGINT_AS_STRING)
);

输出如下所示...

string(20) "12345678901234567890"
array(1) {
  [0]=>
  float(1.2345678901235E+19)
}
array(1) {
  [0]=>
  string(20) "12345678901234567890"
}
object(stdClass)#1 (1) {
  ["num"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#2 (1) {
  ["num"]=>
  string(20) "12345678901234567890"
}

这应该很快就会解决,但现在我只想更新我的答案以反映这些新信息。

于 2012-12-11T10:20:29.850 回答