解决 php5.4 以前版本 json_encode 方法不支持 BIGINT 选项的问题

最近开发项目时遇到 php5.4 以前版本 json_encode 方法不支持 BIGINT 选项的问题,导致大整数 json 解码后变成科学计数法,现将解决方法整理如下:

<?php
header("Content-type: text/html; charset=utf-8");
/* 解决 json_decode 方法处理大整数时变成科学计数法的问题 */
echo "<pre>";
$json = <<<EOT
{
    "foo" : "bar",
    "small" : "123456",
    "large" : 200000000000009093302
}
EOT;
print "原始Json数据:n$jsonn";

//正常解码
$result = json_decode ($json);
print "n正常解码的结果:n";
var_dump ($result);

if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
    //如果PHP 5.4或更高版本,使用JSON "BIGINT" 选项
    $result = json_decode ($json, false, 512, JSON_BIGINT_AS_STRING);
    print "n使用BIGINT选项解码的结果(PHP 5.4+): n";
    var_dump ($result);
} else {
    //低版本的解决方法(大整数转换成字符串)
    $json2 = fixJson ($json);
    $result = json_decode ($json2);
    print "nfixJson方法处理后的Json数据:n$json2n";
    print "nfixJson方法处理后的数据解码结果: n";
    var_dump ($result);
}

/* 将所有大整数增加引号转变为字符串 */
function fixJson ($json) {
    return (preg_replace ('/:s?(d{14,})/', ': "${1}"', $json));
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据