我刚刚开始与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()
函数?有没有更好的方法呢?
答案 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;
});