Silex - app-> json()将整数数据作为字符串返回

时间:2016-02-01 23:47:26

标签: php mysql json silex

我刚刚开始与Silex合作,帮助我构建一个从MySQL数据库返回数据的restful api。以前在使用php和mysql时,我注意到MySQL会在我的json_encode()函数中将整数作为字符串返回。它会在我的所有整数值周围加上引号。我能够解决此问题的唯一方法是将JSON_NUMERIC_CHECK传递到json_encode函数中:

return json_encode($array, JSON_NUMERIC_CHECK);

为我所需要的工作做得很开心。现在我正在使用silex,我一直在使用它的内置json函数来从我的控制器返回值。我注意到我有同样的问题,整数被返回为带有引号的字符串。

$app->get('/suppliers', function () use ($app) {
    $sql = "SELECT * FROM suppliers";
    $suppliers = $app['db']->fetchAll($sql);

    return $app->json(array('suppliers' => $suppliers));
});

供应商的supplier_id字段是整数,但它在json数据中以字符串形式返回。我尝试将JSON_NUMERIC_CHECK传递到我的数组之后的$app->json()函数中,但会获得InvalidArguementException

我确实弄清楚而不是使用$app->json()函数我可以使用json_encode() php函数,它会工作。像这样:

$app->get('/suppliers', function () use ($app) {
    $sql = "SELECT * FROM suppliers";
    $suppliers = $app['db']->fetchAll($sql);

    //return $app->json(array('suppliers' => $suppliers));
    return json_encode(array('suppliers' => $suppliers), JSON_NUMERIC_CHECK);
});

有没有理由不这样做而不是使用silex $app->json()函数?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:9)

尝试使用setEncodingOptions

return $app->json($var, Response::HTTP_OK)->setEncodingOptions(JSON_NUMERIC_CHECK);

答案 1 :(得分:6)

$app->json(...)会返回回复JsonResponse。您可以手动创建此类响应并设置编码选项。

$app->get('/suppliers', function () use ($app) {
    $sql = "SELECT * FROM suppliers";
    $suppliers = $app['db']->fetchAll($sql);

    $response = new \Symfony\Component\HttpFoundation\JsonResponse();
    $response->setEncodingOptions(JSON_NUMERIC_CHECK);
    $response->setData(array('suppliers' => $suppliers));

    return $response;
});

或设置所有已编码的内容

$app->get('/suppliers', function () use ($app) {
    $sql = "SELECT * FROM suppliers";
    $suppliers = $app['db']->fetchAll($sql);

    $response = new \Symfony\Component\HttpFoundation\JsonResponse();
    $response->setContent(json_encode(array('suppliers' => $suppliers), JSON_NUMERIC_CHECK));

    return $response;
});