В Go 1.27 появился стабильный API для работы с JSON

Изображение: OpenAI
В Go 1.27 появился стабильный API для работы с JSON: устранить ограничения прежнего пакета без нарушения совместимости было практически невозможно. Новый API по умолчанию отклоняет JSON с некорректным UTF-8 и повторяющимися именами полей, сообщили разработчики в The Go Blog.
В тестах разработчиков разбор JSON оказался до 10 раз быстрее, чем при использовании прежнего encoding/json. Скорость сериализации осталась примерно на прежнем уровне: в одних случаях новый пакет немного быстрее, в других немного медленнее. Для большего выигрыша авторы рекомендуют адаптировать собственные методы сериализации и разбора к новым потоковым интерфейсам.
Строгие проверки снижают риск разного толкования одних и тех же входных данных. Прежний пакет принимает повторяющиеся имена полей, хотя разные реализации могут трактовать такой объект по-разному. Авторы напоминают, что эту неоднозначность уже использовали в атаках, в том числе при эксплуатации CVE-2017-12635. Новый API также учитывает регистр при сопоставлении имён полей JSON с полями структур Go, а срезы и словари со значением nil сериализует как пустой массив и пустой объект JSON соответственно.
Пакет encoding/json/jsontext позволяет читать и записывать JSON по частям, не загружая всё значение в память целиком. В encoding/json/v2 параметры поведения можно передавать непосредственно функциям сериализации и разбора, а затем использовать их внутри собственных обработчиков.
Переходить на новый API необязательно: разработчики обещают бессрочно поддерживать encoding/json. При миграции параметры позволяют сохранить те особенности прежнего поведения, от которых зависит приложение.



