Порівняння бібліотек розбору й обробки JSON
Головне: Нативні API найшвидші, толерантні парсери дають зміщення. Обирайте за трьома ознаками: локалізація помилок, чи зберігається оригінальний текст і чи межі явні.

Коротко: спершу класифікуйте потребу, потім порівнюйте реалізації — використовуйте нативний JSON.parse для значень лише для читання, jsonc-parser, коли потрібні зміщення або треба зберегти оригінальне форматування, і додавайте бібліотеки запитів чи патчів лише там, де потрібно; ліниво завантажуйте великі бібліотеки посторінково й відкидайте непідтримувані.
Кожна бібліотека стверджує, що вона «швидка, мала й повна». Справді відрізняє їх те, скільки інформації вони дають, коли щось іде не так.
1. Чотири категорії за призначенням
| Категорія | Представницькі бібліотеки | Що вирішують |
|---|---|---|
| Стандартний розбір | JSON.parse / JSON.stringify |
Синтаксис ↔ об'єкт, швидкість на першому місці |
| Толерантний розбір + редагування | jsonc-parser, json5 |
Вхід із коментарями, помилки точні до зміщення, зміни зі збереженням форматування |
| Запити | jsonpath-plus, jsonpath |
Вибирати вузли за виразом |
| Мутації | fast-json-patch, immer |
Генерувати/застосовувати патчі, незмінні оновлення |
Спершу визначте, у якій категорії ви, а вже потім порівнюйте конкретні реалізації — інакше легко використати бібліотеку запитів для роботи парсера.
2. Порівняння пліч-о-пліч
| Бібліотека | Локалізація помилок | Толерантність (коментарі/висячі коми) | Зберігає оригінальне форматування | Придатні сценарії |
|---|---|---|---|---|
JSON.parse |
Лише повідомлення й позиція (залежить від рушія) | ✗ | ✗ | Типовий розбір, дані API |
jsonc-parser |
Точний offset + код помилки |
✓ | ✓ (modify + applyEdits) |
Редактори, конфігураційні файли |
json5 |
Інформація про рядок і стовпець | ✓ (толерантніше) | ✗ | Читання конфігурації JSON5 |
jsonlint |
Інформація про рядок і стовпець | ✗ | ✗ | Лише для довідки, не підтримується активно |
jsonpath-plus |
Помилки синтаксису виразів | — | — | Запити за виразом |
fast-json-patch |
Помилки на рівні операцій | — | — | Генерація й застосування патчів |
lz-string |
— | — | — | Стискання JSON у URL |
Повідомлення про помилки JSON.parse дуже різняться між рушіями. V8 видає щось на кшталт
Unexpected token } in JSON at position 42, але чи точна позиція, залежить від версії рушія;
jsonc-parser натомість повертає стабільну структуровану форму { error, offset, length }, що підходить для маркерів редактора.
3. Чотири ключові точки рішення
3.1 Чи потрібні вам зміщення
Якщо ви будуєте редактор і хочете «клікніть на помилку, щоб перейти до відповідного рядка», вам обов'язково потрібне зміщення. Тест простий: якщо ваше повідомлення про помилку може вивести лише «невалідний JSON», користувачам доведеться шукати самим.
import { parse, printParseErrorCode } from 'jsonc-parser';
const errors: Array<{ error: number; offset: number; length: number }> = [];
parse(text, errors, { allowTrailingComma: true, disallowComments: false });
if (errors.length > 0) {
const firstError = errors[0];
console.error(`${printParseErrorCode(firstError.error)} at offset ${firstError.offset}`);
}
3.2 Чи треба зберегти оригінальний текст
Лише читання значень → підійде будь-який парсер. «Змінити одне поле й залишити все інше точно як було» → треба використовувати API редагувального стилю, а не «розбір → зміна об'єкта → серіалізація».
Останнє втрачає: коментарі, порядок ключів (у деяких реалізаціях), стиль відступів, написання числових літералів (1e3 стає 1000) і форми escape (\u4e2d стає фактичним символом).
3.3 Чи явні крайові поведінки
Перш ніж обрати бібліотеку, перевірте в документації три речі:
- Як обробляються повторювані ключі (зберегти останній / кинути помилку);
- Чи втрачають великі цілі числа точність (більшість JS-бібліотек втрачають, бо всі проходять через
Number); - Підтримувана область для BOM, коментарів і висячих ком.
Якщо документації немає, напишіть маленький зразок і перевірте самі. Це надійніше, ніж читати README.
3.4 Стан підтримки
Ризик бібліотеки JSON — не відсутність функцій, а довготривале занедбання: ніхто більше не випустить патчі безпеки (забруднення прототипу, ReDoS).
4. Порівняння з іншими мовами
| Мова | Стандартна / основна бібліотека | Ключова відмінність |
|---|---|---|
| JavaScript | JSON.parse |
Усі числа подвійної точності |
| TypeScript | Те саме + jsonc-parser / zod |
Типи існують лише під час компіляції |
| Go | encoding/json |
За замовчуванням float64, використовуйте UseNumber() для збереження точності; json.RawMessage для відкладеного розбору |
| Java | Jackson / Gson / Moshi | З Jackson стережіться ризику ввімкнення default typing |
| Python | json / orjson |
parse_float=Decimal зберігає точність; orjson швидший, але не підтримує всі типи |
| Rust | serde_json |
Строго типізована десеріалізація; функція arbitrary_precision зберігає точність |
| C++ | simdjson / RapidJSON | simdjson націлений на пропускну здатність розбору, RapidJSON більш загального призначення |
Обмінюючись даними між мовами, найлегше спіткнутися все ще на точності чисел і форматах часу; вибір бібліотеки може їх лише пом'якшити, а не усунути.
5. Типові комбінації
Варіант 1: утилітарний сайт (сторона браузера)
Розбір і локалізація помилок: jsonc-parser
Редактор: CodeMirror 6 + @codemirror/lang-json
Запити: jsonpath-plus
Патчі: fast-json-patch
Посилання для поширення: lz-string
Визначальна риса цієї комбінації — усе працює локально й жодні дані не завантажуються, що відповідає очікуванням приватності утилітарного сайту.
Варіант 2: серверний шлюз API
Перевірка: Ajv (скомпілювати схему один раз, повторно використовувати)
Розбір: нативний JSON.parse (разом з обмеженням розміру тіла)
Відкладений розбір великих полів: зберегти сирий рядок, розбирати лише за потреби
Не вводьте бібліотеки запитів/патчів у шар шлюзу для реалізації бізнес-логіки — це робота бізнес-шару.
Варіант 3: CLI і скрипти
Вибір полів: jq
Конвертація форматів: yq / dasel
Інтерактивний перегляд: jless
Пакетна перевірка: ajv-cli
6. Реальний вплив розміру пакета й продуктивності
jsonc-parserдуже малий і підходить для основного пакета;json5трохи більший заjsonc-parser, бо підтримує більше синтаксису;jsonpath-plusвключає обчислення виразів і помітно більший, тож його слід завантажувати ліниво посторінково;fast-json-patchсереднього розміру й потрібен лише коли у вас є функція порівняння.
Оптимізація прямолінійна: імпортуйте динамічно посторінково й не кладіть їх у перший чанк.
const { JSONPath } = await import('jsonpath-plus');
7. Чек-лист
- [ ] Обирайте бібліотеки за призначенням; не використовуйте бібліотеку запитів для розбору;
- [ ] Використовуйте
jsonc-parser, коли потрібні точні локалізації помилок; - [ ] Використовуйте API редагувального стилю, коли коментарі й форматування мають зберегтися;
- [ ] Практично перевірте три крайові поведінки: повторювані ключі, великі цілі числа й BOM;
- [ ] Стежте за станом підтримки та безпековими бюлетенями бібліотеки;
- [ ] Динамічно імпортуйте великі бібліотеки за потребою.
Часті питання
Як обрати бібліотеку JSON для розміру мого проєкту?
Малі інструменти, що лише читають дані API, можуть залишатися на нативному JSON.parse. Проєктам, яким потрібні локалізації помилок рівня редактора або яким треба зберегти оригінальне форматування, слід використовувати jsonc-parser. Серверному шлюзу потрібні лише перевірка й розбір, залишаючи бібліотеки запитів і патчів бізнес-шару, тоді як CLI-скрипти можуть безпосередньо використовувати jq, yq і ajv-cli.
Чому стан підтримки важливіший за кількість функцій?
Справжній ризик бібліотеки JSON — довготривале занедбання, а не відсутність функцій: ніхто не випустить патчі безпеки для забруднення прототипу чи ReDoS. Яким би повним не був список функцій, загальмована бібліотека залишає вас патчити її самим. Вважайте підтримку й безпекові бюлетені жорсткими критеріями, а не порівнюйте таблиці функцій.
Чи варто використовувати JSON.parse, щоб змінити одне поле й зберегти коментарі та відступи?
Ні. Розбір, зміна об'єкта, а потім серіалізація втрачає коментарі, порядок ключів, стиль відступів, написання числових літералів (1e3 стає 1000) і форми escape (\u4e2d стає фактичним символом). Зміна одного поля зі збереженням усього іншого потребує API редагувального стилю, як-от modify і applyEdits у jsonc-parser.