Как включить 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.