Стендап Сьогодні
📢
Канал в Telegram @stendap_sogodni
🦣
@stendap_sogodni@shevtsov.me в Федиверсі
16.09.2025
Модуль encoding/json/v2 в Go
…А головне що мені, щоб читати довільні атрибути JSON, довелося ще й використати новинку.
Місяць тому вийшов Go 1.25. Проміж іншим, там зʼявився новий модуль для роботи з JSON - encoding/json/v2
. За домовленостями Go це як той самий модуль, тільки другої версії — але технічно як раз ця версійність і дозволяє повністю змінити не тільки реалізацію, а й інтерфейси. (Та, по-правильному, поки не впровадиш нову версію, модуль мусить зберігати повну сумісність, хоча на практиці це постійно порушують.)
Я вже до того спробував замінити json
на json/v2
в іншому проєкті, але як раз зіткнувся з несумісністю деяких інтерфейсів та відклав, бо великої потреби в оновленні не було. Та й модуль поки експериментальний та потребує особливих параметрів компіляції.
А тут раптом виявляється потреба прочитати невідомі атрибути. Звісно, це легко зробити, якщо прочитати JSON у map[string]interface{}
. Проте потім доведеться вручну зчитувати відомі атрибути. Ну або можна власний UnmarshalJSON()
реалізувати — теж вручну. Це мені не до вподоби. Я хотів би все, що знаю, прочитати у типізовану структуру, а потім решту вже в map
.
Та, виявляється, це одна з можливостей нового пакета. Якщо в структурі присутній атрибут з потрібною анотацією json:",unknown"
- він й отримає всі невідомі значення. Ото й все, що треба було зробити!
Цікаво, що я не бачу такої можливості в жодному сторонньому модулі. Хіба що є відомий підхід з іншого боку — модуль mapstructure, яким можна з нетипізованого map
утворити структуру.
А ще важлива причина чекати json/v2
- там зʼявилося справжнє читання та запис потоком. Бо як я дізнався, стандартний модуль json
завжди буферизує весь текст об’єкта — тут можна почитати. Це, прямо кажучи, бентежить. Хоча, звісно, є багато інших модулів, які це вирішують. Мені, поки що, завжди вистачало стандартного.