Как стать автором
Обновить

Комментарии 12

В языке Java тип Boolean представляет собой обертку над примитивным типом данных, который может принимать значения: true (истина), false (ложь) или быть равно null

В Java тип boolean может хранить null?

Есть тип boolean, который может быть только true или false, а есть Boolean, который является оберткой над примитивом и может быть null. При обмене данными с помощью json часто используют второй, т.к. при добавлении параметра в процессе разработки API десериализация в false при отсутствии параметра в запросе (например, не все потребители в курсе, что API изменилось, или им лень дорабатывать) не всегда будет являться корректной.

Спасибо за замечание, исправила слово тип на слово класс, так более корректно.

boolean это примитив и не может быть null, а Boolean это класс-враппер boolean, соответственно может быть null как другие обьекты

Если про фичи - они же не относятся конкретно к Boolean, так можно поступить с любым классом (пустой массив как null и массив как значение).

А вот то, что любое число кроме 0 сериализуется в true в поведении по умолчанию - это трындец. Падать должно, это же человек неправильно смапил поле.

Вы не поверите в скольких БД и каком количестве кода используется boolean значение как 0/1. Это пошло еще с 70-х годов и корни глубокие.
И сколько лично я видел спецификаций в которых json boolean как "0"/"1" определен.
Так что "не судите и не судимы будете". :)

0/1 понятно, а вот -8700 падать должно

0/не 0 - стандартная логика переходов в ассемблере. Которая плавно переползла в C, потом в C++ и кое где навечно застряла.
создатели парсера сталкиваются со всем многообразием. Возможно кто то попросил сделать еще и эту логику в ущерб "ой мы тут ошибку допустили и на нее должно ругаться".
Я не знаю причин почему принцип "0/ не 0" перенесен на парсер json. Но явно были причины. Поскольку это не ошибка в коде парсера. А так сделано специально.

Я как-то в jdbc дайвер Oracle залез - там ещё Y и N поддерживается. Помимо true, false, 1, 0. Вроде ещё что-то но тут уже не уверен.

А сделал это когда удивился почему это метод getBoolean ( https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getBoolean-int- ) нормально работает хотя в базе у нас был varchar, char, number со значениями 1/0 (в виде числа и символов) и Y/N. И вот там внутри прям много эвристика - типа если в базе число то смотрим на 1 и 0. Если char (один символ) то Y, N, 1, 2. Если varchar ( несколько символов) - то ещё true и false.

ну y/n это нормально.

Собственно, первая часть статьи - обычное поведение слаботипизированного JavaScript (не зря же JSON это JavaScript Object Notation).

Ну а фичи второй части статьи вытекают из первой) Иногда могут быть полезны, но я бы предпочел ловить ошибки, чем разбираться почему массив вдруг превратился в true)

по поводу массивов это не поведение по умолчанию.

Бывает полезно когда внешнее апи имеет кривой дизайн и поле приходит массивом

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации