PHP json_encode encoding numbers as strings
我在使用PHP json_encode函数时遇到问题。 它将数字编码为字符串,例如
1 |
变成
1 | "{ ["id":"3", ...) |
当js遇到这些值时,它将它们解释为字符串,并且对其执行数字操作失败。 有谁知道某种防止
请注意,自PHP 5.3.3起,有一个用于自动转换数字的标志(在PHP 5.3.0中添加了options参数):
1 2 | $arr = array( 'row_id' => '1', 'name' => 'George' ); echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"} |
同样,我正在从数据库(PostgreSQL)读取数据,而一切都是字符串。我们遍历每一行,并用它来完成最终的结果数组,因此我使用了
1 |
在循环内强制将其设为整数值。现在执行
编辑:
1 2 3 4 | <?php // International phone number json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK); ?> |
然后,您将获得以下JSON:
1 | {"phone_number":33123456789} |
我做了一个非常快速的测试:
1 2 3 4 5 6 7 | $a = array( 'id' => 152, 'another' => 'test', 'ananother' => 456, ); $json = json_encode($a); echo $json; |
如果我没记错的话,这似乎就像你所描述的那样?
我得到的输出:
1 | {"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也会对您感兴趣,顺便说一句?
我遇到同样的问题(PHP-5.2.11 / Windows)。我正在使用此解决方法
1 |
它用数字本身替换用引号引起来的所有(非负整数)数字(" 42"变成" 42")。
另请参见PHP手册中的此注释。
尝试
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
但这仅适用于PHP 5.3.3。查看此PHP json_encode更改日志
http://php.net/manual/zh-CN/function.json-encode.php#refsect1-function.json-encode-changelog
以下测试确认将类型更改为字符串会导致json_encode()返回一个数字作为JSON字符串(即用双引号引起来)。使用settype(arr [" var"]," integer")或settype($ arr [" var"]," float")进行修复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php class testclass { public $foo = 1; public $bar = 2; public $baz ="Hello, world"; } $testarr = array( 'foo' => 1, 'bar' => 2, 'baz' => 'Hello, world'); $json_obj_txt = json_encode(new testclass()); $json_arr_txt = json_encode($testarr); echo"<p> Object encoding: </p>[cc lang="php"]" . $json_obj_txt ." |
";
回声"
数组编码:
1 | " . $json_arr_txt ." |
";
//以上两个都将int作为int返回。但是,将int键入字符串,然后...
settype($ testarr [" foo"]," string");
$ json_arr_cast_txt = json_encode($ testarr);
回声"
带强制转换的数组编码:
1 | " . $json_arr_cast_txt ." |
";
?>
code> pre>
因此Pascal MARTIN在这里没有得到足够的认可。对于具有数百个服务器端功能的现有项目,无法在每个JSON返回上检查数字值。
我用php-mysqlnd替换了php-mysql,问题消失了。数字是数字,字符串是字符串,布尔值是布尔值。
为了完整性(因为我还不能添加评论),让我也将此详细信息添加为另一个答案:
(编辑:要在意识到源数据(即在OP的情况下,数据库结果集)可能是问题之后(通过将数字列作为字符串返回)来读取,而json_encode()实际上不是问题的根源)
两种" mysql_fetch_array"的手册页:
Returns an array of strings that corresponds to the fetched row,
...和" mysql_ fetch_ row":
Returns an numerical array of strings that corresponds to the fetched
row
明确指出:返回数组中的条目将是字符串。
(我在phpBB2中使用DB类(是的,我已经过时了!),该类的" sql_fetchrow()"方法使用" mysql_fetch_array()")
没有意识到这一点,我最终还是找到了这个问题,并且理解了这个问题! :)
正如Pascal Martin在其后续评论中所述,我相信一种解决方案可以从源头解决"不正确的类型"问题(即通过使用" mysql_field_type()"函数并在获取后立即进行转换),(或一般而言,其他提取方法(例如"对象"?))会更好。
1 2 3 4 5 6 | $rows = array(); while($r = mysql_fetch_assoc($result)) { $r["id"] = intval($r["id"]); $rows[] = $r; } print json_encode($rows); |
这是PHP版本的问题,有同样的问题将我的PHP版本升级到5.6解决了问题
在处理数据库中的数据时,我也遇到了同样的问题。基本上,问题是PHP中将数组中要转换为json的类型识别为字符串而不是整数。
就我而言,我做了一个查询,该查询从数据库列计数行返回数据。 PDO驱动程序不能将列识别为int,但可以识别为字符串。我通过在受影响的列中将类型转换为int来解决。
将值强制转换为int或float似乎可以解决问题。例如:
1 2 3 4 |
如果出现任何问题,您可以使用(int)!它将正常工作。
只是遇到了同样的问题,数据库是将值作为字符串返回的。
我将其用作解决方法:
1 2 3 4 5 6 | $a = array( 'id' => $row['id'] * 1, 'another' => ..., 'ananother' => ..., ); $json = json_encode($a); |
也就是说,将值乘以1即可将其转换为数字
希望可以帮助某人
json_encode以JSON格式序列化一些数据结构,以通过网络发送。因此,所有内容均为字符串类型。就像当您从$ _POST或$ _GET接收到某些参数时一样。
如果必须对发送的值进行数字运算,只需先将它们转换为int(使用PHP中的intval()函数或Javascript中的parseInt()),然后执行这些运算即可。
好吧,PHP json_encode()返回一个字符串。
您可以在js代码中使用parseFloat()或parseInt():
1 2 3 | parseFloat('122.5'); // returns 122.5 parseInt('22'); // returns 22 parseInt('22.5'); // returns 22 |
就像oli_arborum所说,我认为您可以使用
1 |