Laravel Response::json() 带数字检查

Posted

技术标签:

【中文标题】Laravel Response::json() 带数字检查【英文标题】:Laravel Response::json() with numeric check 【发布时间】:2014-07-22 16:35:00 【问题描述】:

当对具有一些数字字段的模型(使用 mysql 驱动程序)执行 eloquent 查询然后返回结果的 json 响应时,json 似乎将数字值作为字符串而不是数字传递。

例如

$properties = Model::find(6);
return Response::json($properties);

返回类似:


    "name": "A nice item",
    "value": "160806.32"

什么时候应该返回:


    "name": "A nice item",
    "value": 160806.32

在普通 php 中,您可以使用 JSON_NUMERIC_CHECK 来解决此问题,但 Response::json() 方法似乎没有这样的选项。如何确保数字字段以数字而不是字符串形式返回?

【问题讨论】:

【参考方案1】:

您实际上可以通过该选项。如果我们查看JsonResponse class 的源代码,您可以将 json_encode 选项作为最后一个参数传递。

看起来像这样

return Response::json($properties, 200, [], JSON_NUMERIC_CHECK);

或者你可以这样做:

    return Response::make(
        $properties->toJson(JSON_NUMERIC_CHECK), 
        200, 
        ['Content-Type' => 'application/json']
    );

注意:如果$properties 不是 Elequoent 模型,那么它必须至少实现 JsonableInterface

以及

    return Response::make(
        json_encode($properties->toArray(), JSON_NUMERIC_CHECK), 
        200, 
        ['Content-Type' => 'application/json']
    );

Eloquent 中的 toJson() 方法只是包装了 json_encode() 并将其传递给模型的数组。我建议使用前两个选项之一。

【讨论】:

你能举个例子吗? @harryg 添加了一些如何实现此目的的示例:)。 谢谢,Response::make 的示例有点不完美,因为响应缺少 json 标头并且只有默认的 html 标头。否则,似乎可以工作,谢谢。 @harryg 好点:)。我还注意到我的最后一个示例缺少toArray() 现在是 2018 年,但是.. 使用此标志时要小心。如果您的数据库中有“004004004”之类的字符串(例如电话号码),则 json 响应会将其解析为“4004004”。【参考方案2】:

JsonResponse的使用方法setEncodingOptions

return response()->json($properties)->setEncodingOptions(JSON_NUMERIC_CHECK);

【讨论】:

非常感谢!

以上是关于Laravel Response::json() 带数字检查的主要内容,如果未能解决你的问题,请参考以下文章

在laravel中以json值返回视图

Response::json() 发送 html 而不是 json

Laravel 响应::json 失败

Response::json() 返回 text/html 作为内容类型

laravel4 响应::json(array());不适用于托管

使用 Laravel 构建 ORM 的 JSON 和关系