Gymterview
middle

Чем отличается Jackson от Gson?

Jackson и Gson — две основные библиотеки для JSON-сериализации в Java. Обе решают одну задачу, но различаются производительностью, экосистемой и областью применения.

Сравнительная таблица

Критерий Jackson Gson
Разработчик FasterXML (open-source) Google
Производительность Быстрее (особенно Streaming API) Медленнее на больших объёмах
Размер библиотеки Больше (модульная структура) Компактная (~300 KB)
Streaming API JsonParser / JsonGenerator JsonReader / JsonWriter
Tree Model JsonNode JsonElement / JsonObject
Аннотации Богатый набор (@JsonProperty, @JsonCreator и др.) Минимальный (@SerializedName, @Expose)
Модульная система Да (JavaTimeModule, Kotlin и др.) Нет
Spring Boot По умолчанию Требует ручной настройки
record (Java 16+) Полная поддержка Поддержка с 2.10+
Потокобезопасность ObjectMapper переиспользуем Gson переиспользуем

Когда использовать Jackson

  • В любом Spring/Spring Boot проекте — он уже подключён
  • При высоких требованиях к производительности на больших JSON
  • Когда нужен богатый набор аннотаций и модулей
  • В enterprise-проектах

Когда использовать Gson

  • В небольших утилитах, где важен минимальный размер зависимостей
  • В Android-проектах (хотя Moshi и kotlinx.serialization вытесняют Gson)
  • Когда нужна простая библиотека без сложной конфигурации
Пример: Jackson vs Gson
// === Jackson ===
ObjectMapper jackson = new ObjectMapper();
String jacksonJson = jackson.writeValueAsString(user);
User fromJackson = jackson.readValue(jacksonJson, User.class);

// Tree Model
JsonNode node = jackson.readTree(jacksonJson);
String name = node.get("name").asText();

// === Gson ===
Gson gson = new Gson();
String gsonJson = gson.toJson(user);
User fromGson = gson.fromJson(gsonJson, User.class);

// Tree Model
JsonElement element = JsonParser.parseString(gsonJson);
String name2 = element.getAsJsonObject().get("name").getAsString();

// === Gson: кастомизация ===
Gson customGson = new GsonBuilder()
    .setPrettyPrinting()
    .setDateFormat("dd.MM.yyyy")
    .serializeNulls()
    .excludeFieldsWithoutExposeAnnotation()
    .registerTypeAdapter(Money.class, new MoneyTypeAdapter())
    .create();

Частые ошибки

  • Смешивание аннотаций Jackson и Gson в одном проекте — они несовместимы
  • Использование Gson в Spring Boot — конфликт с Jackson, который уже в classpath
  • Предположение, что Gson быстрее из-за меньшего размера — Jackson быстрее в бенчмарках
  • Ручное построение JSON через конкатенацию строк вместо использования библиотеки

На собеседовании: кратко сравните по 3-4 критериям (производительность, экосистема, Spring Boot) и дайте рекомендацию: Jackson — стандарт для серверной Java, Gson — для простых случаев и legacy. В Kotlin-проектах всё чаще используется kotlinx.serialization.