middle
Чем отличается Jackson от Gson?
Jackson и Gson — две основные библиотеки для JSON-сериализации в Java. Обе решают одну задачу, но различаются производительностью, экосистемой и областью применения.
Сравнительная таблица
| Критерий | Jackson | Gson |
|---|---|---|
| Разработчик | FasterXML (open-source) | |
| Производительность | Быстрее (особенно 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.