Сравниваем Java-библиотеки для работы с JSON: JSON.simple, GSON, Jackson и JSONP

JSON на сегодняшний день — общепринятый стандарт обмена данными между сервером и веб-приложением, и, что часто бывает со многими стандартами, мы можем принять его как данное, не углубляясь в принципы его работы. Зачастую мы не задумываемся о том, какие библиотеки используем для работы с JSON, хотя, безусловно, между ними есть разница. Приняв это во внимание, мы провели ряд тестов с целью узнать, насколько быстро каждая из четырёх самых популярных библиотек для работы с JSON справляется с разбором различных по размеру файлов. Теперь мы готовы поделиться с вами полученными результатами.

Часто JSON используется для передачи и разбора больших файлов. Этот сценарий распространён в приложениях для обработки данных, запущенных на кластерах Hadoop или Spark. В зависимости от размера файла можно наблюдать значительную разницу в скорости работы конкретной библиотеки. Небольшие файлы могут приходить всё время в роли запросов, их разбор происходит быстро, поэтому разница в скорости на первый взгляд не играет большой роли, но чем больше файлов вам надо обработать, тем больше эта разница. Микросервисы и распределённые приложения используют JSON для передачи такого вида файлов, т.к. это стандарт де-факто для веб API.

Не все JSON-библиотеки одинаковы — выбор подходящей под вашу задачу может быть критичен. Тесты производительности, приведённые в данной статье, помогут вам выбрать правильную библиотеку.

Библиотеки для работы с JSON

Для своих тестов мы выбрали четыре библиотеки — JSON.simle, GSON, Jackson, JSONP — исходя из их популярности на Github, именно они чаще всего используются в проектах на Java.

  • JSON.simple от Yidong Fang. Небольшая и легковесная библиотека для кодирования и декодирования JSON, несмотря на свою простоту, выполняет свою работу на высоком уровне.
  • GSON от Google. Библиотека, которая умеет конвертировать Java объекты в JSON и наоборот. Не требует специальным образом аннотировать классы, а также в качестве бонуса имеет полную поддержку Java Generics. Отсутствие необходимости добавления аннотаций упрощает реализацию и даже может быть главным требованием, если вы собираетесь сериализовывать объекты, не имея для них исходного кода.
  • Jackson от FasterXML. Набор инструментов для обработки данных, основанный на потоковом JSON-парсере и генераторе. Предназначенная для Java библиотека умеет работать не только с JSON. Имеет самый популярный JSON-парсер (исходя из статистики использования на GitHub).
  • JSONP от Oracle. API для работы с JSON, а именно для генерации и разбора потоковых JSON-текстов. Эталонная реализация JSR353 с открытым исходным кодом.

Тестирование производительности

Мы провели тесты производительности на разных по размеру файлах. Требования (а значит, и производительность) к обработке различных по размеру файлов отличаются, в то время как возникают новые окружения, в которых нам нужно обрабатывать эти файлы.

Были проверены два ключевых сценария — разбор больших (190 Мб) и маленьких (1 Кб) файлов. Большой JSON-файл был взят отсюда, маленькие были сгенерированы случайным образом с помощью http://www.json-generator.com/.

В обоих случаях был выполнен прогон каждого файла 10 раз. Для больших файлов в каждом прогоне было 10 итераций, для маленьких — 10000. Мы не оставляли маленькие файлы в памяти между итерациями. Все тесты были запущены на c3.large в облаке AWS.

Результат для больших файлов показан в таблице ниже, для маленьких в целях экономии места будут только усреднённые результаты. Подробные результаты можно посмотреть здесь. Весь исходный код доступен здесь.

Большие файлы

table-1

Здесь мы наблюдаем большую разницу в результатах. В зависимости от прогона, Jackson или JSON.simple показывают наилучшую скорость работы, в сумме по всем тестам Jackson всё же вырывается вперёд. В среднем по всем тестам, наилучшую скорость работы с большими файлами показывают Jackson и JSON.simple, далеко позади них идёт JSONP на третьем месте и GSON на четвёртом.

Взглянем на результаты под другим углом — в процентном соотношении:

table-2

Это похоже на фото-финиш — Jackson выходит из этой гонки победителем, ему в затылок дышит JSON.simple. Две другие библиотеки еле заметно маячат в зеркале заднего вида.

Маленькие файлы

table-3

В таблице выше представлены средние результаты для 10 прогонов по каждому файлу, и среднее по всем файлам внизу таблицы. Количество файлов, для которых каждая из библиотек отработала быстрее всего:

  • GSON — 14
  • JSONP — 5
  • Jackson — 1
  • JSON.simple — 0

Цифры говорят сами за себя. В любом случае, если рассматривать средние результаты по всем тестам для маленьких файлов, победителем выходит GSON, JSON.simple и JSONP занимают второе и третье место соответственно, Jackson на последнем месте. Итак, несмотря на то, что JSON.simple не был самым быстрым ни на одном из тестовых файлов, в среднем он выходит на второе место. Аналогично, хотя JSONP всех быстрее справился со многими файлами, в итоге он занимает третье место.

Нужно подметить то, что хотя Jackson в данном случае — самая медленная библиотека, он показывает похожие результаты на каждом файле, в то время как другие библиотеки в большинстве случаев демонстрируют много большую скорость работы, но на некоторых файлах скорость их работы сравнима с Jackson, или даже немного ниже.

Теперь взглянем на результаты в процентном соотношении:

table-4

GSON выигрывает гонку на маленьких файлах, JSON.simple опять показывает второй результат, немного отставая от победителя, JSONP занимает явное третье место, и, наконец, Jackson замыкает гонку.

Заключение

Скорость разбора — не единственный критерий при выборе библиотеки для работы с JSON, но один из самых важных. Выполнив описанные в статье тесты производительности, мы обнаружили, что не существует библиотеки, которая бы работала лучше остальных на файлах всех размеров. Библиотеки, которые хорошо показали себя на больших файлах, проваливались на маленьких и наоборот.

Таким образом, выбор библиотеки исходя из скорости работы зависит от конкретного случая:

  • если вам часто приходится работать с большими JSON-файлами, то интересующей вас библиотекой будет Jackson. GSON испытывает наибольшие затруднения при работе с большими файлами.
  • если вам приходится иметь дело с большим количеством коротких JSON-запросов (как это часто происходит в сервисах и распределённых приложениях), выбирайте GSON. Jackson справляется с большим количеством маленьких файлов хуже всего.
  • если вам необходимо работать как с большими, так и с маленькими файлами, JSON.simple вам в помощь: по результатам тестов он занимает второе место для обоих типов файлов. Ни Jackson, ни GSON не могут с должной скоростью работать одновременно с разными по размеру файлами.

Когда дело касается скорости, JSONP вряд ли можно порекомендовать для какого-либо случая — он работает медленно (по сравнению с другими доступными библиотеками) как с большими, так и с маленькими файлами. К счастью, в Java 9 обещают встроить поддержку JSON, которая должна стать улучшением текущей эталонной реализации JSR353 в лице JSONP.

На этом всё. Ещё раз вкратце: если вам важна скорость разбора файлов JSON-библиотекой, выбирайте Jackson для больших по размеру файлов, GSON — для маленьких и JSON.simple для одновременной работы с файлами обоих типов.

Перевод статьи «The Ultimate JSON Library: JSON.simple vs GSON vs Jackson vs JSON»