PHP json_encode 将数字编码为字符串

IT技术 php javascript json
2021-02-04 14:31:50

我在使用 PHP json_encode 函数时遇到了一个问题。它将数字编码为字符串,例如

array('id' => 3)

变成

"{ ["id": "3", ...)

当 js 遇到这些值时,它会将它们解释为字符串,并且数字操作会失败。有谁知道某种方法可以防止json_encode将数字编码为字符串?谢谢!

6个回答

请注意,自 PHP 5.3.3 起,有一个用于自动转换数字的标志(PHP 5.3.0 中添加了 options 参数):

$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}
如果您的字符串不是数字而是如下内容,则会产生一些副作用: 5252788e16597 。参考:bugs.php.net/bug.php?id=64695
2021-03-18 14:31:50
正如 Brad 和 wadim 所提到的,JSON_NUMERIC_CHECK 具有将合法字符串转换为数值的副作用。为了克服这个问题,如果您知道每个字段的类型,您可以使用以下解决方法:将“标记”(例如“this_is_a_string”)连接到任何字符串字段的值,然后使用 JSON_NUMERIC_CHECK 选项执行 json_encode,最后从 json 字符串中删除标记:$cleaned_json= str_replace('this_is_a_string', '', $marked_json)。不优雅,但对我有用。
2021-03-18 14:31:50
工作完美,直到它将数字标签转换为整数,在 IE 中炸毁 .toLowerCase()。小心,这个解决方案很简单,但过于热情。
2021-03-30 14:31:50
JSON_NUMERIC_CHECK尝试通过尝试解析字符串来自动猜测字符串是否为数字。如果你仔细想想,那是非常不可靠的。它会将所有看起来像数字的属性转换为数字(不仅是您想要的那些),并且只有当它们看起来像数字时才会这样做。如果不是不安全,那至少是不稳定的。使用生成的 JSON 的代码可能依赖于一种或另一种类型。如果这些期望没有得到满足,奇怪的事情就会发生。如果您关心良好实践和安全性,您应该有选择地转换您想要的值。
2021-04-05 14:31:50
请注意,JSON_NUMERIC_CHECK 需要 PHP 5.3.3。
2021-04-10 14:31:50

我,同样是从数据库(PostgreSQL)中读取,一切都是一个字符串。我们遍历每一行并使用它来构建我们的最终结果数组,所以我使用了

$result_arr[] = array($db_row['name'], (int)$db_row['count']);

在循环内强制它是一个整数值。当我json_encode($result_arr)现在这样做时,它正确地将其格式化为数字。这使您可以控制来自数据库的数字是什么,不是数字。

编辑:

json_encode()函数还可以使用JSON_NUMERIC_CHECK标志作为其第二个参数即时执行此操作您需要小心使用它,但如文档中的用户示例所示(复制如下):http : //uk3.php.net/manual/en/function.json-encode.php#106641

<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>

然后你会得到这个 JSON:

{"phone_number":33123456789}
是的,问题似乎出在数据库适配器上,它不解释数据类型,而不是json_encode函数。这是最正确的答案,但要小心,因为JSON_NUMERIC_CHECK还会转换电话号码和其他数字字符串值,这可能会导致前导零或“+”出现问题……我建议在 DB 读取功能中更正此问题。
2021-04-08 14:31:50

我做了一个非常快速的测试:

$a = array(
    'id' => 152,
    'another' => 'test',
    'ananother' => 456,
);
$json = json_encode($a);
echo $json;

如果我没记错的话,这似乎就像你描述的那样?

我得到的输出:

{"id":152,"another":"test","ananother":456}

因此,在这种情况下,整数尚未转换为字符串。


尽管如此,这可能取决于我们使用的 PHP 版本:根据 PHP 的版本,已经纠正了几个与 json_encode 相关的错误......

这个测试是用 PHP 5.2.6 进行的;我在 PHP 5.2.9 和 5.3.0 上得到了同样的东西;不过,我没有另一个 5.2.x 版本来测试:-(

您使用的是哪个版本的 PHP?还是您的测试用例比您发布的示例更复杂?

也许http://bugs.php.net/上的一个错误报告可能与此相关?例如,错误 #40503:json_encode 整数转换与 PHP 不一致


也许Bug #38680你也会感兴趣,顺便说一句?

(续)认为数值的数据类型是字符串?有任何想法吗?
2021-03-14 14:31:50
我用的7还是有这个问题
2021-03-26 14:31:50
谢谢马丁。我正在使用 5.2.9。我想知道数字数据是否作为字符串从数据库中读取?我确定字段类型是 int,但我想不出其他解释。我会在我的系统上尝试您的快速测试,看看我是否得到相同的结果。
2021-04-04 14:31:50
我不完全知道“为什么数据作为字符串从 MySQL 返回”的技术原因;; 可能与 PHP 和 MySQL 之间的驱动程序有关;;这是(至少在某些情况下)由 PHP 5.3 附带的新 mysqlnd 驱动程序更正的东西(请参阅blog.ulf-wendel.de/?p=184;在页面中搜索“整数”以找到有趣的句子) ;; 但我同意这不好^^
2021-04-06 14:31:50
大约 5.2.9 好;如果您的数据来自数据库,问题可能就在那里:我经常看到数据来自数据库,所有内容都被转换为字符串(我已经在 PDO 和 mssql 中看到了这一点;但是,如果我没记错的话,这也会发生对于 PHP < 5.3 中的 MySQL,当新的 mysqlnd 驱动程序尚不存在时) ;; 要检查您的数据是什么样的,您可以使用 var_dump,它输出数据的每个部分的类型。
2021-04-08 14:31:50

尝试 $arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);

但它只适用于 PHP 5.3.3。看看这个 PHP json_encode 更改日志 http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog

这对我有用。使用来自 postgre db 的数据在 debian Squeeze 6.0.5 上默认安装 PHP+apache
2021-03-31 14:31:50

我遇到了同样的问题(PHP-5.2.11/Windows)。我正在使用此解决方法

$json = preg_replace( "/\"(\d+)\"/", '$1', $json );

它用数字本身替换引号中的所有(非负整数)数字('"42"' 变为 '42')。

另请参阅PHP 手册中的此注释

@SSHThis,也许您应该使用此语法将数组转换为 JSON 编码的数组而不是对象。$json_array = json_encode($some_array, false);所以 false 参数告诉 PHP 不要进行对象转换。
2021-03-15 14:31:50
我有一个相反的问题,我需要在 PHP 7.0 中将整数编码为字符串并使用它 $this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
2021-03-20 14:31:50
我将原来的正则表达式更改为 `"/\"(\d+\.?\d*)\"/" ` 以包含小数,另一个注意事项是使用 JSON_NUMERIC_CHECK 的人将面临这个问题,当一个字符串也是正确的科学记数法中的数字。例如,19E008。JSON_NUMERIC_CHECK 将其转换为 190000 ...
2021-03-24 14:31:50
使用该解决方法根本不安全。您将获得具有以下结构的无效 json:json_encode(array(-1=>'que', '0'=>'-1'))
2021-03-25 14:31:50
感谢您的代码,但遗憾的是它在我的 json 上不起作用,因为我有一个数字作为对象名称,并且它似乎使 json 无效:(
2021-04-01 14:31:50