【问题标题】:Laravel 5 controller sending JSON integer as stringLaravel 5 控制器将 JSON 整数作为字符串发送
【发布时间】:2015-10-10 04:46:03
【问题描述】:

在我的开发服务器上,来自 Laravel 5 控制器的 JSON 响应以正确的类型显示数据。

例如

imdb_rating: 7.6
imdb_votes: 6271

但在生产服务器上,JSON 响应以字符串形式发回。

imdb_rating: "7.60"
imdb_votes: "6271"

开发和生产都安装了相同版本的 PHP (5.6.11-1)。

关于可能导致这种行为的任何想法?

【问题讨论】:

  • 数据是否来自mysql表?
  • 听起来可能很愚蠢,但是您能检查一下您是否在两台机器上都使用了 MySQL Native Driver (mysqlnd) 吗? MySQL Client Library 驱动程序将所有字段作为字符串返回,而不管类型如何,使用 MySQL Native Driver 时不是这种情况
  • 好吧,使用 PHP 5.6 版你可能会这样做。
  • 你试过return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK); 吗?
  • 我已经添加了一个答案。可能对遇到此问题的其他人有好处。

标签: php json laravel laravel-5 php-5.6


【解决方案1】:

您可以使用类型转换返回整数,例如

return (int)Post::find(1)->id;

【讨论】:

    【解决方案2】:

    我刚刚遇到了同样的问题!对于那些正在寻找更合适的解决方案的人,您可能想查看 Eloquent 模型的 $casts 属性。

    接受的解决方案将起作用,但它也会转换您可能不想转换的字段。我建议将此添加到您的 Eloquent 模型中:

    protected $casts = [ 'imdb_rating' => 'float', 'imdb_votes' => 'integer' ];
    

    这将直接转换模型对象中的值,因此您无需担心更新多个端点。我希望这对其他人有帮助!

    【讨论】:

    • 优秀的解决方案。我喜欢这解决了无论底层平台的问题。这是文档的快速链接。好东西在这里:laravel.com/docs/5.4/eloquent-mutators#attribute-casting
    • 很生气 laravel 需要这个开销来修复数据类型。这对性能有何影响?
    • 成功了!但是我仍然不太明白当我的数据库数据类型是 tinyint 时,为什么我需要手动将其转换为 int?可笑!
    • 这必须是我同意的公认答案。我几乎遵循了接受的答案,并且会后悔它可能在我的代码中造成的混乱。
    • 为什么这对我不起作用,而另一个对我不起作用?我正在投射`'纬度' => 'double'`,它仍然作为字符串发送。
    【解决方案3】:

    确保使用支持原生数据类型的MySQL Native Driver

    如果使用 mysqlnd 库,可以通过设置 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 连接选项将整数和浮点列转换回 PHP 数字。如果设置,mysqlnd 库将检查结果集元数据列类型并将数字 SQL 列转换为 PHP 数字,如果 PHP 数据类型值范围允许的话。这样,例如,SQL INT 列作为整数返回。

    MySQL 客户端库会将所有字段作为字符串返回。

    另一种解决方案是使用带有JSON_NUMERIC_CHECK 的json_encode 选项。

    例如:

    return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK);
    

    【讨论】:

    • 这终于解决了我的问题,在ubuntu中安装过程还是蛮简单的:apt-get remove php5-mysql,apt-get install php5-mysqlnd,service apache2 restart
    • 谢谢。 =D。通过安装 php55w-mysqlnd 与 CentOS 兼容
    猜你喜欢
    • 2015-06-25
    • 2017-04-25
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2013-03-20
    • 2016-04-03
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多