Логическое значение в ответе JSON преобразуется в строку на рабочем сервере - PullRequest
0 голосов
/ 27 августа 2018

У меня есть приложение Laravel.В таблице users у меня есть столбец boolean с именем active:

$table->boolean('active')->default(false);

. И во внешнем интерфейсе я обычно проверяю, активен ли пользователь или нет:

Обычный JS: if(user.active){ // do stuff }

VueJS: v-if="user.active"

Этот подход предполагает, что значение свойства user.active, которое, конечно, исходит из ответа json,это нестроковое значение: либо 0, либо 1. И это то, что я действительно получаю на локальной машине:

response in local

Здесь значения розового цвета представляют Строка значения и значения зеленого цвета представляют Число значений.Итак, очевидно, что мой локальный компьютер интерпретирует его как Числовое значение, и когда число 0 или 1 используется в условном выражении, оно преобразуется в логическое значение.

Однако на моем производственном сервере это не так.Ответ json на рабочем сервере преобразуется в строку, что приводит к непреднамеренному поведению моего приложения:

response in production

Обратите внимание, что значение для activeключ не номер , это String здесь!И поскольку она интерпретируется как строка, любая непустая строка всегда будет иметь значение true;следовательно, мое состояние всегда будет оцениваться как true.

У меня есть два вопроса: а) Почему это происходит?б) Как это исправить?

Дополнительная информация: На рабочем и локальном серверах установлена ​​одинаковая версия mysql.Версия PHP на prod: 7.2.8 и версия PHP на локальном: 7.2.9.

1 Ответ

0 голосов
/ 27 августа 2018

Я думаю, что вы назначаете значение для активного ключа как числовое значение 0. Но JSON интерпретирует BOOLEAN только с двумя значениями true и false.Просто попробуйте присвоить значение 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.

...