Скрытые ловушки десериализации Boolean: разбираем неочевидные особенности библиотеки Jackson
Библиотека Jackson является мощным инструментом для сериализации и десериализации данных в формат JSON в Java-приложениях. Она предоставляет гибкую и эффективную обработку данных, позволяя преобразовывать Java-объекты в JSON-строки (сериализация) и обратно (десериализация).
Но не всегда процесс десериализации данных в библиотеке Jackson происходит очевидным образом. В этой статье я хочу разобрать несколько примеров не очевидной десериализации Boolean в библиотеке Jackson.
Особенности реализации
В языке Java тип Boolean представляет собой обертку над примитивным типом данных, который может принимать значения: true (истина), false (ложь) или быть равно null. А вы знали, что при десериализации в тип Boolean в JSON можно передавать не только значения true, false и null, но и другие?
Довольно логичным является тот факт, что если передать значения true или false в кавычках, как строку, то оно интерпретируется Jackson как соответствующее значение. А если передать «null», возникнет ли ошибка десериализации?
Hidden text
Нет, ошибки не будет, переменная будет равна null
Jackson так же умеет десериализовать значения «True», «TRUE», «False», «FALSE». Другие варианты написания приведут к ошибке.
Предлагаю продолжить эксперименты, что будет, если передать пустую строку (»)?
Hidden text
Переменная так же будет равна null
Вторым довольно очевидным является то, что можно передавать значения 0 и 1 в JSON, и эти числовые значения успешно десериализуются в тип Boolean, соответственно, 0 преобразуется в false, а 1 — в true.
Но попробуйте предположить, что будет, если передать любое другое целое число?
Hidden text
Любое целое число при десериализации в тип Boolean интерпретируется Jackson как true, независимо от того, является ли оно положительным или отрицательным.
Фичи
Если вам недостаточно описанного выше, то Jackson может предложить вам еще кое-что для десериализации типа Boolean.
Внимание ⚠: Данная функциональность представлена для ознакомления, используйте ее, если точно понимаете, что она делает и к каким последствиям это приведет.
В Jackson есть много разных фич для десериализации, и для нашего Boolean может пригодиться несколько из них. Первая фичa UNWRAP_SINGLE_VALUE_ARRAYS, название говорит само за себя, если в качестве значения передан массив с одним значением, то он разворачивается в это значение. В таком случае, если передать значение:
{
"bool": [-8788888888888888888888888888888]
}
то оно десериализуется в true. Здорово, правда? Будет работать во всех вышеописанных случаях.
Но что, если передать пустой массив, если хочется получить null? Работать не будет, будет ошибка десериализации. А если очень хочется, то можно включить фичу ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, которая, ожидаемо будет приводить пустой массив к null, и наша переменная будет равна именно ему.
Вот и все. Теперь, когда вы осознали эту магию, можете смело использовать это в своих проектах (за исключением последней части). Важно помнить, что при работе с десериализацией Boolean в JSON необходимо быть внимательными и учитывать спецификации и требования вашего проекта. Правильное понимание этих особенностей позволит вам избежать ошибок и создать более надежные и гибкие системы обработки данных.