json_encode中文 - php json_encode数组




PHP json_encode将数字编码为字符串 (12)

json_encode以JSON格式序列化一些数据结构,以便通过网络发送。 因此,所有内容都将是字符串类型。 就像你从$ _POST或$ _GET收到一些参数一样。

如果必须对发送的值进行数字操作,只需先将它们转换为int(使用PHP中的intval()函数或使用Javascript中的parseInt()),然后执行操作。

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

array('id' => 3)

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

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


为了完整性(因为我不能添加评论),让我也添加这个细节作为另一个答案:

(编辑:在意识到源数据(即在OP的情况下,数据库结果集)可能是问题(通过将数字列作为字符串返回),并且json_encode()实际上不是问题的根源)

mysql_fetch_array ”的手册页:

返回与提取的行对应的字符串数组

...和“ mysql_ fetch_ row ”:

返回与提取的行对应的字符串的数字数组

明确指出; 返回数组中的条目将是字符串。

(我在phpBB2中使用DB类(是的,我知道它已经过时!),并且该类的“sql_fetchrow()”方法使用“mysql_fetch_array()”)

没有意识到,我也最终找到了这个问题,并理解了这个问题! :)

正如帕斯卡尔马丁在他的后续评论中所说的,我相信一个解决方案能够在源头处理“错误类型”问题(即通过使用“ mysql_field_type() ”函数并在获取后立即执行转换操作(或其他获取方法,如“对象”?))总的来说会更好。


只要遇到同样的问题,并且数据库以字符串形式返回值。

我使用这个作为解决方法:

$a = array(
    'id' => $row['id'] * 1,
    'another' => ...,
    'ananother' => ...,
);
$json = json_encode($a);

这是将值乘以1以将其转换为数字

希望能帮助别人


如果发生任何问题,您可以使用(int)! 它会正常工作。


将这些值转换为int或float似乎可以解决这个问题。 例如:

$coordinates => array( 
    (float) $ap->latitude,
    (float) $ap->longitude 
);


我也有同样的问题处理数据库中的数据。 基本上问题是数组中要在json中转换的类型被PHP识别为字符串,而不是整数。 在我的情况下,我做了一个查询,从数据库列计数行返回数据。 PDO驱动程序不会将该列识别为int,而是将其识别为字符串。 我通过在受影响的列中执行cast来解决此问题。


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

$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/一个错误报告可能是相关的? 例如, Bug#40503:json_encode整数转换与PHP不一致


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


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

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

它用数字本身替换引号中包含的所有(非负数,整数)数字(''42''变成'42')。

另请参阅PHP手册中的此评论


所以在这里没有得到足够的信用。 对于具有数百个服务器端功能的现有项目,检查每个JSON返回值的数值是不可行的。

我用php-mysqlnd替换了php-mysql,问题就消失了。 数字是数字,字符串是字符串,布尔值是布尔值。


那么,PHP json_encode()返回一个字符串。

你可以在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);  




json