Комментарии 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.
Собственно, первая часть статьи - обычное поведение слаботипизированного JavaScript (не зря же JSON это JavaScript Object Notation).
Ну а фичи второй части статьи вытекают из первой) Иногда могут быть полезны, но я бы предпочел ловить ошибки, чем разбираться почему массив вдруг превратился в true)
Скрытые ловушки десериализации Boolean: разбираем неочевидные особенности библиотеки Jackson