Как включить null значения в JSON с помощью Gson в Java
Быстрый ответ
Если требуется обеспечить сериализацию значений null с помощью Gson, следует использовать метод .serializeNulls():
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(new HashMap<String, Object>() {{
put("key1", null);
put("key2", "value2");
}});
В результате получим строку json, в которой будет {"key1":null,"key2":"value2"}, это гарантирует включение записей со значением null.

TypeAdapter: Контроль над сложной сериализацией
При работе со сложными объектами или когда требуется пользовательская сериализация, для тонкой настройки процесса используются TypeAdapter или JsonSerializer:
class CustomTypeAdapter extends TypeAdapter<YourClass> {
@Override
public void write(JsonWriter out, YourClass value) throws IOException {
// Здесь сериализация переходит на новый уровень.
// Важно не забывать про null.
}
@Override
public YourClass read(JsonReader in) throws IOException {
// Здесь выполняется десериализация объекта.
}
}
Gson gson = new GsonBuilder()
.registerTypeAdapter(YourClass.class, new CustomTypeAdapter())
.serializeNulls() // делаем null-значения доступными.
.create();
Теперь ваш TypeAdapter действует как дирижёр, управляющий сериализацией каждого типа и включающий обработку null.
Декодирование JSON: Устанавливаем значения по умолчанию
При декодировании JSON обратно в Java стоит задуматься об установке значений по умолчанию для полей:
class Example {
String key1 = "default"; // Устанавливаем значение по умолчанию.
String key2 = "default"; // Устанавливаем значение по умолчанию.
}
Gson gson = new Gson();
Example example = gson.fromJson(json, Example.class);
Если в json для key1 указан null, то Example.key1 сохранит значение "default", пока не будет использован метод .serializeNulls(), явно присваивающий значение null.
Визуализация
Пары ключ-значение в Map можно представить как экспонаты музея. Среди них есть невидимые null, не замеченные без особых условий.
| Элемент Map | Сериализация Gson | Экспонат |
| ---------------------------- | ------------------------ | ------------------- |
| ("Золотая реликвия", 🏆) | Включено | 🏆 выставлен |
| ("Изумрудное украшение", 💎) | Включено | 💎 выставлен |
| ("Невидимый артефакт", null) | Игнорируется по умолчанию | Отсутствует 🚫 |
По умолчанию Gson пропускает «невидимые артефакты». Однако можно настроить правила для их «выставления»:
gsonBuilder.serializeNulls(); // Оживляем невидимых!
С такой настройкой каждый экспонат, даже те, что не были замечены, займёт своё место на пьедестале:
| После применения SerializeNulls |
| ------------------------------- |
| 🏆 выставлен |
| 💎 выставлен |
| Невидимый артефакт выставлен |
Подобно современному искусству, serializeNulls придаёт значение невидимому.
Сделаем JSON компактным и красивым
Настройка setPrettyPrinting придаст вашему JSON эстетическую привлекательность, сохраняя его компактность:
Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
// Элегантность и компактность могут сосуществовать.
Используйте setPrettyPrinting по желанию; без его применения JSON останется максимально сжатым.
Дань уважения сообществу
Важно ценить и благодарить за полезные идеи, ответы и обсуждения сообщества, которые помогли нам при настройке Gson.
Не только для новичков
Руководство пользователя Gson и обсуждения в репозитории – это отличные источники для углублённого изучения, решения сложных задач и понимания работы с null в Gson.
Это не баг, а функция!
Помните, что пропуск null значений в Map – это не баг Gson, а особенность его функциональности. Вы как разработчик контролируете поведение Gson.
Полезные материалы
- Gson – gson 2.10.1 javadoc — Подробная официальная документация Gson.
- Как конвертировать hashmap в JSON объект в Java – Stack Overflow — Обсуждение сериализации HashMap в JSON с помощью Gson.
- Проблемы · google/gson · GitHub — источник идей о том, как Gson обрабатывает
nullот создателей и поклонников библиотеки. - .net – разделение строки до тире – asp.net c# – Stack Overflow — пример пользовательской сериализации Gson с использованием TypeAdapter.


