Часті питання про інструменти: дані, файли й експорт
Чи завантажуються дані, який файл працює, чи щось зберігається локально, чому китайський текст стає escape-послідовностями: десять питань, що промовляють справжні межі онлайн-інструменту JSON.
Збирає найчастіші питання про інструменти цього сайту й про специфікацію JSON, згруповані за сценарієм, з відповіддю, за якою можна одразу діяти, а не розпливчастим висновком.
Статей: 25Чи завантажуються дані, який файл працює, чи щось зберігається локально, чому китайський текст стає escape-послідовностями: десять питань, що промовляють справжні межі онлайн-інструменту JSON.
Чи дозволені коментарі, чому висяча кома дає помилку, чи потрібні лапки ключам, чому 9007199254740993 змінюється — дванадцять висновків, кожен звірено з RFC 8259.
Чи мають шляхові запити використовувати JSONPath чи Pointer, як обирати між Patch і Merge Patch, що Schema може заблокувати й як обрати версію чернетки — усе в одному проході.
Чому файл JSON на десятки МБ не відкривається, скільки коштує глибоке клонування, як запобігти забрудненню __proto__ і звідки входить XSS — десять висновків першої допомоги, впорядкованих за симптомом.
Стиль найменування, формати часу, семантика null, форми переліків, формати конфігурації, організація тестових даних і конфлікти злиття — дванадцять компромісів, про які команди справді сперечаються.
У RFC 8259 немає синтаксису коментарів, тож `//` і блокові коментарі змушують JSON.parse кидати виняток. Натомість використовуйте JSON5 або JSONC, поле `_comment`, опис Schema чи YAML.
Висячі коми законні в обʼєктних літералах JavaScript і фатальні в JSON. Ось точна помилка, граматика RFC 8259, що її спричиняє, і три виправлення, які справді тримаються.
UTF-8 BOM — це три невидимі байти, тож JSON.parse зазнає збою на першому символі й повідомляє рядок 1, стовпець 1, через що файл виглядає порожнім або обрізаним.
У JSON лише десяткові числові літерали. JSON.stringify перетворює NaN і Infinity на null без попередження, і саме тому «числове поле іноді null» постійно виринає у виробництві.
Цілі числа понад 2^53-1 втрачають точність у JSON.parse. ID-сніжинки, номери замовлень і bigint із бази даних усі на це натрапляють, тож тримайте їх рядками від початку до кінця.
Escape-послідовність \u4e2d\u6587 — це законний Unicode, а не збій кодування. Справжні «кракозябри» виглядають інакше, і розрізнення їх вирішує, що вам насправді треба виправити.
Строгі надмножини за порядком: JSONC додає коментарі; JSON5 додає одинарні лапки, ключі без лапок, висячі коми й шістнадцяткові числа. Неправильний вибір ламає API, а не ваш редактор.
JSON розмежовує дужками, а YAML — відступами: машинам JSON, людям, що редагують конфігурацію, — YAML. Коментарі, якорі та структура кількох документів не виживають.
JSON Pointer — унікальна адреса, яку можна зберегти як ключ; JSONPath — мова запитів. Неправильний вибір ламає оновлення конфігурації або винаходить зламаний JSONPath.
Schema керує структурою й типами, а не бізнес-сенсом. Вона зупиняє відсутні поля, неправильні типи й позадіапазонні переліки, тоді як правила на кшталт «сума понад нуль» залишаються в коді.
2020-12 — чинна й додає $defs, prefixItems і unevaluatedProperties, але багато інструментів усе ще знають лише draft-07. Обирайте за тим, що підтримує весь ваш інструментарій.
json-schema-to-typescript і quicktype видають .d.ts однією командою, але це чернетка: необовʼязковість, обʼєднання, additionalProperties і дати потребують людського проходу.
Оптимізація в неправильному порядку робить будь-яку заміну бібліотеки марною. Виміряйте мережу, розбір і відображення окремо, потім скоротіть розбори, зменшіть навантаження й переходьте на потокову обробку.
JSON.parse трактує __proto__ як звичайний ключ; пошкодження відбувається в рекурсивному злитті, що пише в Object.prototype, тож кожен обʼєкт успадковує властивості атакувальника.
JSON ніколи не виконується сам. XSS трапляється в момент, коли ви трактуєте його як HTML — склеювання рядків на сервері, `innerHTML` на фронтенді або вбудовування JSON просто в тег скрипта.
Вам не треба читати політику приватності, щоб це зʼясувати. Відкрийте панель мережі, спробуйте сторінку офлайн і перезавантажте, щоб побачити, чи щось збереглося. Дві хвилини, три перевірки, жодної довіри не потрібно.
Фіксованої межі немає; обмеження — бюджет памʼяті вашої вкладки. Файл на 20 МБ типово стає 60–100 МБ після розбору, а підсвічений DOM може подвоїти це знову.
Голі обʼєкти чисті, доки не потрібні метадані; повні обгортки безпечні, але багатослівні. Для більшості проєктів використовуйте статус HTTP для результатів і стабільну обгортку для даних.
Epoch-числа й рядки ISO мають власні компроміси, але ламає речі саме їх змішування. Використовуйте ISO 8601 зі зміщенням, зберігайте UTC, відображайте в часовому поясі користувача.
`null` каже, що поле існує без значення; пропуск каже, що поле не існує. Тіла PATCH, злиття конфігурації й попереднє заповнення форм — ось де різниця кусає.