🔥 Java может получить JSON из коробки: JEP 540 стал Candidate
Чтобы прочитать пару полей из JSON в небольшом CLI, скрипте или утилите, Java-проекту до сих пор нужна внешняя библиотека. JEP 540: Simple JSON API (Incubator) предлагает закрыть этот базовый сценарий стандартным модулем jdk.incubator.json.
Важно: статус Candidate ещё не означает попадание в конкретную версию JDK. JEP пока не назначен ни на JDK 28, ни на другой релиз, а API остаётся инкубационным и может измениться.
🛠 Что предлагают
В центре API — sealed-интерфейс JsonValue и шесть типов, соответствующих модели JSON:
- JsonObject
- JsonArray
- JsonString
- JsonNumber
- JsonBoolean
- JsonNull
Документ парсится одним вызовом Json.parse(), после чего по дереву можно перемещаться через
Если поле отсутствует или имеет неожиданный тип, API выбрасывает JsonValueException с путём и позицией
ошибки. Для необязательных полей предусмотрен tryGet() (возвращает Optional), а для обработки JSON - null — tryValue().
Генерация тоже входит в предложение: компактный JSON возвращает toString(), форматированный с отступами — статический метод Json.toDisplayString(json, indent).
🔒 Парсер намеренно строгий
JEP ориентируется на RFC 8259 и отклоняет:
- комментарии;
- trailing commas;
- повторяющиеся имена полей внутри объекта;
- расширения вроде JSON5.
Такой подход должен уменьшить неоднозначность при обмене данными между разными системами.
⚠️ Это не замена Jackson
Авторы специально ограничили область применения. В API не будет:
- data binding между JSON и Java-объектами;
- потокового (streaming) парсинга;
- расширенного конфигурирования;
- нестандартных JSON-диалектов.
Кроме того, модель древовидная: исходный документ должен целиком помещаться в памяти как String или char[].
Поэтому для DTO, кастомной сериализации и больших payload'ов по-прежнему нужны Jackson, Gson или Jakarta
JSON. А вот для небольших интеграций, конфигурационных файлов, JDK-инструментов и разовых утилит новый
API может убрать лишнюю зависимость и заметно сократить бойлерплейт.
💡 Чтобы попробовать
API поставляется в инкубаторном модуле и требует флага --add-modules jdk.incubator.json как при
компиляции, так и при запуске:
bash
javac --add-modules jdk.incubator.json Weather.java
java --add-modules jdk.incubator.json Weather
💬 Мнение
Хороший дизайн именно потому, что он не пытается стать «ещё одним Jackson». JDK закрывает минимальный сценарий: строго распарсить JSON, пройти по дереву и собрать документ обратно. Всё сложное остаётся специализированным библиотекам.
Использовали бы стандартный JDK API для небольших JSON-интеграций или предпочли бы оставить один JSON-стек на Jackson во всех проектах?
