Laravel 5控制器将JSON整数作为字符串发送

Mug*_*les 27 php json laravel php-5.6 laravel-5

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

例如

imdb_rating: 7.6
imdb_votes: 6271
Run Code Online (Sandbox Code Playgroud)

但是在生产服务器上,JSON响应将作为字符串发回.

imdb_rating: "7.60"
imdb_votes: "6271"
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*ers 54

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

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

protected $casts = [ 'imdb_rating' => 'float', 'imdb_votes' => 'integer' ];
Run Code Online (Sandbox Code Playgroud)

这将直接在模型对象中转换值,因此您无需担心更新多个端点.我希望这能帮助别人,因为它帮助了我!

  • 没有人会介意逐个铸造土地? (6认同)
  • 有效!但我仍然不太明白我的DB数据类型是tinyint为什么我需要手动将它转换为int?荒谬! (3认同)
  • laravel需要此开销来修复数据类型,这很恼火。这如何影响性能? (2认同)

Dav*_*ain 45

确保使用支持本机数据类型的MySQL Native Driver.

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

MySQL Client Library将所有字段作为字符串返回.

另一个解决方案是使用json_encode选项JSON_NUMERIC_CHECK.

例如:

return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK);
Run Code Online (Sandbox Code Playgroud)

  • 这最终解决了我的问题,安装过程在ubuntu中非常简单:`apt-get remove php5-mysql`,`apt-get install php5-mysqlnd`,`service apache2 restart` (4认同)

mil*_*ili 21

同样的问题也发生在我身上,Laravel 在我发布到共享主机后将所有数字数据作为字符串返回。但在我的本地主机上一切正常。于是找到了这个解决方案。

转到 cPanel --> 选择 PHP 版本 --> 扩展选项卡

然后取消选中pdo_mysql并选中nd_pdo_mysql扩展名。请参阅我的 cPanel 扩展列表的以下屏幕截图 cPanel 扩展列表

我通过比较本地主机和共享托管服务器的phpInfo找到了这个解决方案。请参阅我进行更改之前和之后的 phpInfo 页面的以下 2 个屏幕截图。

修复前 修复前

修复后 在此输入图像描述

感谢 DavidDomain 的回答,它让我大开眼界,找到了这个解决方案

我希望我的回答对某人有所帮助。