我在php中使用json_encode遇到了一个非常奇怪的问题。
<?php
// this is just example data, please pretend this is coming
// out of a database query in laravel (DB::SELECT("sql query here"))
$arrOfClasses = [];
$arrOfClasses[] = (object) array( 'name'=>'Joe Schmo',
'id' => '315e321268',
'custNum' => '123');
$arrOfClasses[] = (object) array( 'name'=>'Jill Jones',
'id' => '123123123',
'custNum' => '456');
echo "<pre>";
print_r($arrOfClasses);
$tmpArr = [];
foreach ($arrOfClasses as $c) {
// I broke the encode and decode parts of this out
// in order to trap where the error is ocurring
echo "Processing: " . $c->name . "<br>";
$tmp = json_encode($c, JSON_NUMERIC_CHECK); // THIS IS WHERE THE ERROR IS HAPPENING
// it is seeing the id of the first user as a infinite number
$tmpReturn = json_last_error_msg();
echo $tmpReturn . "<hr>";
$tmp2 = json_decode($tmp,true);
$tmpArr[] = $tmp2;
}
print_r($tmpArr);
这是我从此代码段获得的输出:
Array
(
[0] => stdClass Object
(
[name] => Joe Schmo
[id] => 315e321268
[custNum] => 123
)
[1] => stdClass Object
(
[name] => Jill Jones
[id] => 123123123
[custNum] => 456
)
)
Processing: Joe Schmo
Inf and NaN cannot be JSON encodedProcessing: Jill Jones
No errorArray
(
[0] =>
[1] => Array
(
[name] => Jill Jones
[id] => 123123123
[custNum] => 456
)
)
问题似乎与我的示例数据中的Joe Schmo的ID有关。当它通过json_encode函数运行时,由于JSON_NUMERIC_CHECK,它会尝试将其转换为数字。在我的实际应用程序中,这是一个用于JS前端的Laravel后端API,我需要将数字作为数字返回,将字符串作为字符串返回,所以我需要在那里有JSON_NUMERIC_CHECK。
请注意:如果我在我发布的示例代码中取出JSON_NUMERIC_CHECK,它似乎工作正常。但是,由于Laravel 4.2正在使用&#34; Response :: json()&#34;要将代码输出到浏览器,我相信它在内部遇到了同样的问题。
我不知道如何解决这个问题。我想出的临时解决方案如下:
foreach ($results[$key] as $key2=>$val2) {
if (is_numeric($val2)) {
if (is_infinite($val2)) {
$results[$key]->$key2 = "'" . $val2 . "'";
}
}
}
然而,这可能会导致问题,因为有些客户使用这个特定的端点,并且不知道要删除我将json_encode看作无限数字的值括起来的单引号。
我还在研究,但如果有人能帮我解决这个问题,我会非常感激。
瓦德