PHP json_encode将数字编码为字符串

Chr*_*ill 132 javascript php json

我有一个PHP json_encode函数的问题.它将数字编码为字符串,例如

array('id' => 3)
Run Code Online (Sandbox Code Playgroud)

"{ ["id": "3", ...)
Run Code Online (Sandbox Code Playgroud)

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

Rij*_*ijk 328

请注意,自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"}
Run Code Online (Sandbox Code Playgroud)

  • `JSON_NUMERIC_CHECK`试图通过尝试解析它来自动猜测字符串是否为数字.如果你考虑一下,这是非常不可靠的.它会将**所有**看起来数字的属性转换为数字(不仅仅是你想要的那些),只有当它们看起来像数字时才会这样做.如果不是不安全的话,这至少是不稳定的.使用生成的JSON的代码可能依赖于类型是一个或另一个.如果不满足这些期望,就会发生奇怪的事情.如果您关心良好实践和安全性,您应该有选择地转换您想要的值. (20认同)
  • 工作完美,直到它将数字标签转换为整数,在IE中炸毁.toLowerCase().小心,这个解决方案很简单但过于热心. (10认同)
  • 你是我的英雄喜欢它. (6认同)
  • 如果您的字符串不是数字但是内容如下,则会产生一些副作用:5252788e16597.参考:https://bugs.php.net/bug.php?id = 64695 (5认同)
  • 请注意,JSON_NUMERIC_CHECK需要PHP 5.3.3. (4认同)
  • 正如Brad和wadim所提到的,JSON_NUMERIC_CHECK具有将合法字符串转换为数值的副作用.要想知道每个字段的类型,可以使用以下解决方法:连接任何字符串字段的值'marker'(例如'this_is_a_string'),然后使用JSON_NUMERIC_CHECK选项执行json_encode,最后从json字符串中删除了标记:$ cleaning_json = str_replace('this_is_a_string','',$ marked_json).不优雅,但为我工作. (3认同)
  • 这很危险!像"3424e123"和"+18675309"这样的字符串将作为数字写入JSON. (2认同)

mou*_*ron 35

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

$result_arr[] = array($db_row['name'], (int)$db_row['count']);
Run Code Online (Sandbox Code Playgroud)

在循环内强制它为整数值.当我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);
?>
Run Code Online (Sandbox Code Playgroud)

然后你得到这个JSON:

{"phone_number":33123456789}
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 28

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

$a = array(
    'id' => 152,
    'another' => 'test',
    'ananother' => 456,
);
$json = json_encode($a);
echo $json;
Run Code Online (Sandbox Code Playgroud)

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

我得到了输出:

{"id":152,"another":"test","ananother":456}
Run Code Online (Sandbox Code Playgroud)

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


不过,这可能取决于我们使用的PHP版本:已经纠正了几个与json_encode相关的错误,具体取决于PHP的版本...

这个测试是用PHP 5.2.6完成的; 我在PHP 5.2.9和5.3.0中得到了同样的东西; 我没有另外的5.2.x版本来测试,但:-(

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

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


也许Bug#38680也会引起你的兴趣,顺便问一下?

  • OK约5.2.9; 如果您的数据来自数据库,问题可能就在那里:我经常看到数据来自数据库,所有内容都被转换为字符串(我已经看过PDO和mssql;但是,如果我没记错的话,这也会发生对于PHP中的MySQL <5.3,当新的mysqlnd驱动程序尚不存在时);; 要检查数据的外观,可以使用var_dump,它输出数据各部分的类型. (11认同)
  • 我用的7还是有这个问题 (3认同)

oli*_*rum 8

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

$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
Run Code Online (Sandbox Code Playgroud)

它用数字本身替换用引号括起的所有(非负数,整数)数字('"42"'变成'42').

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


小智 7

尝试 $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