Стендап Сьогодні
📢 Канал в Telegram @stendap_sogodni
🦣 @stendap_sogodni@shevtsov.me в Федиверсі

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

16.09.2025

Модуль encoding/json/v2 в Go

#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 завжди буферизує весь текст об’єктатут можна почитати. Це, прямо кажучи, бентежить. Хоча, звісно, є багато інших модулів, які це вирішують. Мені, поки що, завжди вистачало стандартного.