JSON响应中的布尔值在生产服务器上转换为字符串

时间:2018-08-27 06:21:32

标签: php json laravel boolean

我有一个Laravel应用程序。在users表中,有一个名为boolean的{​​{1}}列:

active

通常我会在前端检查用户是否处于活动状态:

普通JS:$table->boolean('active')->default(false);

VueJS:if(user.active){ // do stuff }

此方法假设v-if="user.active"属性的值(当然来自json响应)是一个非字符串值:0或1。这就是我实际上在本地计算机上收到的值:

response in local

这里粉红色的值表示 String 值,绿色值表示 Number 值。 因此,很明显,我的本地计算机将其解释为数值,并且在条件表达式中使用数字0或1时,它将转换为布尔值。

但是,在我的生产服务器上并非如此。生产服务器中的json响应将转换为字符串,这会导致我的应用程序发生意外行为:

response in production

请注意,user.active键的值不是 Number ,这里是 String !并且由于将其解释为字符串,所以任何非空字符串将始终求值为active;因此我的病情总是会评估为true

我有两个问题:a)为什么会这样? b)我该如何解决?

其他信息:生产服务器和本地服务器都运行相同的mysql版本。产品上的PHP版本:7.2.8,本地上的PHP版本:7.2.9。

3 个答案:

答案 0 :(得分:0)

我认为您正在将活动密钥的值分配为数字值0。但是JSON仅使用两个值true和false解释BOOLEAN。只需尝试将值分配为true和false即可,而不是0和1。

作为参考,请检查https://www.tutorialspoint.com/json/json_data_types.htm

根据评论编辑

是的,您可以按照需要的方式在前端修改记录,因为您将在前端使用数组和对象。但是,当您将这些值发布到服务器时,您会将数组对象转换为json字符串,并且json字符串将假定0或1为数字或字符串,并将true和false作为布尔值。因此,您必须以JSON的工作方式分配密钥。希望此方法在从客户端到服务器以及从服务器到客户端发送数据时都可以使用。

这是由于以下原因,

大多数前端语言都是可解释的,因此它们可以自由执行而无需编译。但是后端语言将在执行之前进行编译。这就是为什么我们使用var定义任何数据类型,而js将以任何方式使用它们的原因。但是像Java和.NET这样的后端语言需要定义变量类型。

另一方面,JSON不是一种语言。与XML类似,它用于在客户端和服务器之间发送原始数据。它以与前端和后端一起工作的方式进行设计。因此,您必须分配两个平台都可接受的值。这就是为什么必须分配true或false而不是0和1的原因。

答案 1 :(得分:0)

如果您为数据库表使用 Eloquent 模型,您可以将 $casts 属性分配给您的模型,以确保 JSON 响应中的数据类型。

例如您的“用户”表:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [ 'active' => 'boolean' ];
}

Documentation is here

答案 2 :(得分:0)

由于问题仍在得到答案,我将留下这个特定问题的实际答案(类型不匹配)。

在生产服务器上启用 MySQL native driver for PHP,解决了我的问题。