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

Silex - app->json() returning integer data as strings

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

return json_encode($array, JSON_NUMERIC_CHECK);

工作得很好,满足了我的需要。现在我正在使用 silex,我一直在使用它的内置 json 函数从我的控制器获取 return 值。我注意到我遇到了同样的问题,整数被 returned 作为带有引号的字符串。

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

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

供应商有一个 supplier_id 字段,它是一个整数,但它在 json 数据中被 return 编辑为字符串。我尝试在我的数组之后将 JSON_NUMERIC_CHECK 传递给 $app->json() 函数,但会得到 InvalidArguementException

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

$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() 函数吗?有更好的方法吗?

$app->json(...) returns 回复 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;
});

尝试使用 setEncodingOptions

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