我遇到了PHP json_encode函数的一个问题。它将数字编码为字符串,例如
array('id' => 3)
变为
"{ ["id": "3", ...)
当js遇到这些值时,它会将它们解释为字符串,并且数值操作会失败。有没有人知道某种方法可以阻止json_encode
将数字编码为字符串?谢谢!
答案 0 :(得分:315)
请注意,自PHP 5.3.3起,there's a flag用于自动转换数字(在PHP 5.3.0中添加了options参数):
$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}
答案 1 :(得分:33)
我,同样是从DB(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}
答案 2 :(得分:28)
我做了一个非常快速的测试:
$a = array(
'id' => 152,
'another' => 'test',
'ananother' => 456,
);
$json = json_encode($a);
echo $json;
如果我没弄错的话,这似乎就像你描述的那样?
我得到了输出:
{"id":152,"another":"test","ananother":456}
因此,在这种情况下,整数尚未转换为字符串。
不过,这可能取决于我们使用的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 integer conversion is inconsistent with PHP?
也许Bug #38680也会引起你的兴趣,顺便说一下?
答案 3 :(得分:8)
我遇到了同样的问题(PHP-5.2.11 / Windows)。我正在使用此解决方法
$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
用数字本身替换用引号括起的所有(非负数,整数)数字('“42”'变成'42')。
答案 4 :(得分: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
答案 5 :(得分:3)
以下测试确认将类型更改为字符串会导致json_encode()将数字作为JSON字符串返回(即,用双引号括起来)。使用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>";
?>
答案 6 :(得分:2)
所以Pascal MARTIN在这里没有得到足够的信任。对于具有数百个服务器端功能的现有项目,检查每个JSON返回的数值是不可行的。
我用php-mysqlnd替换了php-mysql,问题就消失了。数字是数字,字符串是字符串,布尔值是布尔值。
答案 7 :(得分:2)
为了完整起见(因为我还不能添加评论),我还要将此细节添加为另一个答案:
(编辑:在认识到源数据(即在OP的情况下,数据库结果集)可能是问题(通过将数字列作为字符串返回)后读取,并且json_encode()实际上不是源问题)
“mysql_fetch_array”的手册页:
返回与获取的行
对应的字符串数组
...和“mysql_ fetch_ row”:
返回与获取的数字相对应的数字字符串数组 行
明确指出;返回数组中的条目将是字符串。
(我在phpBB2中使用了DB类(是的,我知道,它已经过时了!),并且该类的“sql_fetchrow()”方法使用“mysql_fetch_array()”)
没有意识到这一点,我也最终找到了这个问题,并理解了这个问题! :)
正如Pascal Martin在后续评论中所述,我相信一个解决方案可以解决源头上的“错误类型”问题(即使用“mysql_field_type()”函数并正确进行投射在获取之后,(或其他类似“对象”的获取方法?))一般会更好。
答案 8 :(得分:0)
我在处理数据库中的数据时遇到了同样的问题。基本上问题是数组中要转换为json的类型被PHP识别为字符串而不是整数。 在我的情况下,我做了一个查询,从DB列计数行返回数据。 PDO驱动程序不将列识别为int,而是将其识别为字符串。我通过在受影响的列中执行强制转换来解决问题。
答案 9 :(得分:0)
$rows = array();
while($r = mysql_fetch_assoc($result)) {
$r["id"] = intval($r["id"]);
$rows[] = $r;
}
print json_encode($rows);
答案 10 :(得分:0)
这是php版本的问题,有同样的问题将我的php版本升级到5.6解决了问题
答案 11 :(得分:0)
将值转换为int或float似乎可以解决它。例如:
$coordinates => array(
(float) $ap->latitude,
(float) $ap->longitude
);
答案 12 :(得分:0)
如果出现任何问题,您可以使用(int)!!它会正常工作。
答案 13 :(得分:-1)
好吧,PHP json_encode()返回一个字符串。
你可以在js代码中使用parseFloat()或parseInt():
parseFloat('122.5'); // returns 122.5
parseInt('22'); // returns 22
parseInt('22.5'); // returns 22
答案 14 :(得分:-1)
遇到同样的问题,数据库将值作为字符串返回。
我将其用作解决方法:
$a = array(
'id' => $row['id'] * 1,
'another' => ...,
'ananother' => ...,
);
$json = json_encode($a);
即将该值乘以1以将其转换为数字
希望能帮到某人
答案 15 :(得分:-2)
就像oli_arborum说的那样,我认为你可以使用preg_replace
来完成这项工作。只需更改命令:
$json = preg_replace('#:"(\d+)"#', ':$1', $json);
答案 16 :(得分:-2)
json_encode将一些JSON格式的数据结构序列化,以便通过网络发送。因此,所有内容都是字符串类型。就像从$ _POST或$ _GET收到一些参数一样。
如果必须对发送的值进行数值运算,只需先将它们转换为int(使用PHP中的intval() function或Javascript中的parseInt())然后执行操作。