В Java появится встроенный API для работы с JSON без внешних библиотек — JEP предлагает инкубационный модуль jdk.incubator.json. Он решает простые задачи парсинга и генерации RFC 8259-совместимых документов минимумом кода. Идея в том, чтобы сделать тривиальные операции с JSON такими же короткими, как в Python или Go, особенно для новичков и небольших программ.
API построен на интерфейсе JsonValue с sealed-иерархией из шести подтипов: JsonObject, JsonArray, JsonString, JsonNumber, JsonBoolean и JsonNull. Парсинг выполняется одним вызовом Json.parse(...), который возвращает дерево JsonValue. Навигация идёт через методы доступа: get(String) для объектов, get(int) для массивов. Извлечь данные можно через методы конверсии — asString(), asInt(), asLong(), asDouble(), asBoolean(), asMap(), asList(). Все они выбрасывают JsonValueException при несовпадении типа, без попыток неявного преобразования. При ошибках парсинга выбрасывается JsonParseException с указанием позиции и проблемы, включая дубликаты ключей — они запрещены строго, как того требует надёжная machine-to-machine-коммуникация.
Для документов с изменяющейся структурой предусмотрены tryGet(String), возвращающий Optional, и tryValue(), помогающий безопасно обработать возможное JsonNull. Генерация JSON делается через toString() (компактный вывод) или Json.toDisplayString(value, indent) (pretty-print). Оба выдают строки, пригодные для обратного парсинга.
Числа обрабатываются строго. asDouble() округляет до ближайшего double и бросает исключение при выходе за пределы диапазона; NaN и Infinity в JSON недопустимы. asInt() и asLong() требуют точного представления целого, с возможностью парсинга синтаксических дробей вроде 123.0 или 234.56E2. Для произвольной точности можно получить BigDecimal через toString() значения.
Мотивация — избавиться от обязательных внешних зависимостей вроде Jackson, Gson или Jakarta JSON Processing. Пример из статьи: вычисление средней температуры из ответа U.S. National Weather Service REST API укладывается в несколько строк с .get("properties").get("periods").asList().stream().mapToInt(...).average(). Помимо удобства, встроенный JSON открывает путь к использованию его в самом JDK, например для конфигурационных файлов вместо properties-формата, который не умеет естественно задавать массивы — вместо security.provider.1=SUN можно будет написать {"providers":["SUN","SunRsaSign","SunEC"]}.
В JEP сознательно отказались от data binding, стриминга и расширений синтаксиса вроде комментариев или trailing commas. Это сохраняет API небольшим и дешёвым в поддержке, а кому нужна полная функциональность — могут продолжать пользоваться Jackson. Тестировать обещают строго, в том числе с опорой на JSON Parsing Test Suite. Инкубационный модуль jdk.incubator.json пока отключён по умолчанию; для экспериментов его включают флагом --add-modules jdk.incubator.json как при компиляции, так и при запуске.