Как включить null значения в JSON с помощью Gson в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если требуется обеспечить сериализацию значений null с помощью Gson, следует использовать метод .serializeNulls():

Java
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

TypeAdapter: Контроль над сложной сериализацией

При работе со сложными объектами или когда требуется пользовательская сериализация, для тонкой настройки процесса используются TypeAdapter или JsonSerializer:

Java
Скопировать код
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 стоит задуматься об установке значений по умолчанию для полей:

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, не замеченные без особых условий.

Markdown
Скопировать код
| Элемент Map                  | Сериализация Gson         | Экспонат             |
| ---------------------------- | ------------------------  | -------------------  |
| ("Золотая реликвия", 🏆)      | Включено                  | 🏆 выставлен         |
| ("Изумрудное украшение", 💎) | Включено                  | 💎 выставлен         |
| ("Невидимый артефакт", null) | Игнорируется по умолчанию | Отсутствует 🚫       |

По умолчанию Gson пропускает «невидимые артефакты». Однако можно настроить правила для их «выставления»:

Java
Скопировать код
gsonBuilder.serializeNulls(); // Оживляем невидимых!

С такой настройкой каждый экспонат, даже те, что не были замечены, займёт своё место на пьедестале:

Markdown
Скопировать код
| После применения SerializeNulls |
| ------------------------------- |
| 🏆 выставлен                    |
| 💎 выставлен                    |
| Невидимый артефакт выставлен    |

Подобно современному искусству, serializeNulls придаёт значение невидимому.

Сделаем JSON компактным и красивым

Настройка setPrettyPrinting придаст вашему JSON эстетическую привлекательность, сохраняя его компактность:

Java
Скопировать код
Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
// Элегантность и компактность могут сосуществовать.

Используйте setPrettyPrinting по желанию; без его применения JSON останется максимально сжатым.

Дань уважения сообществу

Важно ценить и благодарить за полезные идеи, ответы и обсуждения сообщества, которые помогли нам при настройке Gson.

Не только для новичков

Руководство пользователя Gson и обсуждения в репозитории – это отличные источники для углублённого изучения, решения сложных задач и понимания работы с null в Gson.

Это не баг, а функция!

Помните, что пропуск null значений в Map – это не баг Gson, а особенность его функциональности. Вы как разработчик контролируете поведение Gson.

Полезные материалы

  1. Gson – gson 2.10.1 javadoc — Подробная официальная документация Gson.
  2. Как конвертировать hashmap в JSON объект в Java – Stack OverflowОбсуждение сериализации HashMap в JSON с помощью Gson.
  3. Проблемы · google/gson · GitHub — источник идей о том, как Gson обрабатывает null от создателей и поклонников библиотеки.
  4. .net – разделение строки до тире – asp.net c# – Stack Overflow — пример пользовательской сериализации Gson с использованием TypeAdapter.