PHP的json_encode编码数字作为string
我有一个PHP的json_encode函数的问题。 它将数字编码为string,例如
array('id' => 3)
变
"{ ["id": "3", ...)
当js遇到这些值时,它将它们解释为string,并且数字操作失败。 有没有人知道一些方法来防止json_encode
作为string编码数字? 谢谢!
我做了一个非常快速的testing:
$a = array( 'id' => 152, 'another' => 'test', 'ananother' => 456, ); $json = json_encode($a); echo $json;
如果我没有弄错,这似乎就像你所描述的那样?
我得到的结果是:
{"id":152,"another":"test","ananother":456}
所以,在这种情况下,整数还没有被转换为string。
不过,这可能取决于我们正在使用的PHP版本:已经有一些json_encode相关的错误被修正,这取决于PHP的版本…
这个testing已经用PHP 5.2.6进行了; 我得到了PHP 5.2.9和5.3.0相同的东西; 我没有另外的5.2.x版本来testing,但是:-(
你正在使用哪个版本的PHP? 还是你的testing用例比你发布的例子更复杂?
也许关于http://bugs.php.net/的一个错误报告可能是相关的?; 例如, Bug#40503:json_encode整数转换与PHP不一致 ?
也许臭虫#38680也可能让你感兴趣,顺便说一句?
请注意,自PHP 5.3.3以来, 有一个自动转换数字的标志 (在PHP 5.3.0中添加了选项参数):
$arr = array( 'row_id' => '1', 'name' => 'George' ); echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}
我同样是从DB(PostgreSQL)读取的,一切都是一个string。 我们循环遍历每一行,并用它来完成我们最终的结果数组,所以我使用了
$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}
我遇到了同样的问题(PHP-5.2.11 / Windows)。 我正在使用此解决方法
$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
它用数字本身代替引号中的所有(非负数,整数)数字(''42''变成'42')。
另请参阅PHP手册中的此评论 。
尝试$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);$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
以下testing证实,将types更改为string会导致json_encode()以JSONstring的forms返回数字(即,用双引号括起来)。 使用settype(arr [“var”],“integer”)或settype($ arr [“var”],“float”)来修复它。
<?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><pre>" . $json_obj_txt . "</pre>"; echo "<p>Array encoding:</p><pre>" . $json_arr_txt . "</pre>"; // Both above return ints as ints. Type the int to a string, though, and... settype($testarr["foo"], "string"); $json_arr_cast_txt = json_encode($testarr); echo "<p>Array encoding w/ cast:</p><pre>" . $json_arr_cast_txt . "</pre>"; ?>
我也有同样的问题处理来自数据库的数据。 基本上问题是,在json中转换的数组中的types被PHP识别为一个string,而不是整数。 在我的情况下,我做了一个查询,从一个数据库列计数行返回数据。 PDO驱动程序不会将该列识别为int,而是将其识别为string。 我通过在受影响的列中执行cast来解决此问题。
为了完整性(因为我还不能添加评论),让我也添加这个细节作为另一个答案:
(编辑:在意识到源数据(即在OP的情况下,数据库结果集)可能是问题(通过返回数字列作为string),并且json_encode()实际上不是问题的根源)
“ mysql_fetch_array ”的手册页:
返回对应于获取行的string数组 ,
…和“ mysql_ fetch_ row ”:
返回与获取的行对应的string的数字数组
明确指出; 在返回的数组中的条目将是string。
(我在phpBB2中使用DB类(是的,我知道它已经过时!),并且该类的“sql_fetchrow()”方法使用“mysql_fetch_array()”)
没有意识到,我也最终find了这个问题,并理解了这个问题! 🙂
正如帕斯卡尔·马丁(Pascal Martin)在他的后续评论中所说的那样,我相信一个解决scheme能够在源头处理“错误types”问题(即通过使用“ mysql_field_type() ”函数并在获取后立即执行其他的获取方法,如“对象”?))将是更好的一般。
这是PHP版本的问题,有同样的问题升级我的PHP版本到5.6解决了这个问题
将这些值转换为int或float似乎可以解决这个问题。 例如:
$coordinates => array( (float) $ap->latitude, (float) $ap->longitude );
如果发生任何问题,您可以使用(int)! 它会正常工作。
那么,PHP的json_encode()返回一个string。
你可以在js代码中使用parseFloat()或parseInt():
parseFloat('122.5'); // returns 122.5 parseInt('22'); // returns 22 parseInt('22.5'); // returns 22
$rows = array(); while($r = mysql_fetch_assoc($result)) { $r["id"] = intval($r["id"]); $rows[] = $r; } print json_encode($rows);
只是遇到同样的问题,是数据库返回的值作为string。
我使用这个作为解决方法:
$a = array( 'id' => $row['id'] * 1, 'another' => ..., 'ananother' => ..., ); $json = json_encode($a);
这是将值乘以1以将其转换为数字
希望能帮助别人
json_encode以JSON格式序列化一些数据结构,以便通过networking发送。 因此,所有内容将是stringtypes。 就像你从$ _POST或$ _GET收到一些参数一样。
如果必须对发送的值进行数字操作,只需先将它们转换为int(使用PHP中的intval()函数或使用Javascript中的parseInt()),然后执行操作。
就像oli_arborum说的,我认为你可以使用preg_replace
来完成这项工作。 只需要像这样改变命令:
$json = preg_replace('#:"(\d+)"#', ':$1', $json);