在php中执行json_encode时遇到无限数量

时间:2016-09-02 19:00:53

标签: php json laravel

我在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看作无限数字的值括起来的单引号。

我还在研究,但如果有人能帮我解决这个问题,我会非常感激。

瓦德

0 个答案:

没有答案