JSON - абревіатура від Java Script Object Notation, яка являє собою формат, який використовує текст, зрозумілий людині, для передачі даних, що складаються з пар атрибут - значення. Це найбільш поширений формат даних, використовуваний для асинхронного зв'язку між браузером і сервером, в значній мірі заміняє XML (AJAX).
JSON - це незалежний від мови формат даних, який був отриманий з jаvascript. З 2017 року багато мов програмування використовують код для генерації та аналізу даних тільки в ньому. Імена файлів JSON використовують розширення .json.
Історія створення
Спочатку формат JSON розробив Дуглас Крокфорд на початку нульових, і в подальшому два конкуруючих стандарту (RFC 7159 і ECMA-404) визначили його в 2013 році. Стандарт ECMA описує тільки допустимий синтаксис, в той час як RFC охоплює деякі основи безпеки і взаємодії. Крім того, існує стандарт RFC 7493 який визначає обмежений профіль, відомий як I-JSON (скорочення від «Internet JSON»). Він прагне подолати деякі проблеми взаємодії. Кожен такий документ є дійсним документом JSON. Необхідність у створенні цього формату зросла з потреби в реальному протоколі зв'язку між сервером і браузером, що здійснюється в реальному часі без використання плагінів (таких, як Flash або Java-аплети).
Розвиток і застосування
Як уже зазначено, Дуглас Крокфорд, будучи творцем компанії StateSoftware, вперше позначив і популяризував формат JSON. Згодом співзасновники домовилися про створення системи, що використовує стандартні можливості браузера, і надали абстракционный рівень для розробників для створення додатків з безперервним дуплексним підключенням до веб-сервера. При цьому з'явилася можливість утримувати два HTTP-з'єднання відкритими і обробляти їх до стандартного часу роботи браузера, якщо обмін даними не проводився. Співзасновники провели обговорення за круглим столом і проголосували за те, щоб назвати формат даних JSML або JSON, а також визначити тип ліцензії, за яким нова розробка стане доступна. В даний час формат має відкритий вихідний код.
Практичне використання
Веб-сайт JSON.org був запущений в 2002 році. У грудні 2005 року Yahoo! почав пропонувати деякі зі своїх веб-сервісів в цьому форматі. Google став застосовувати канали JSON для свого веб-протоколу GData тільки в грудні 2006 року. Спочатку формат файлу JSON призначався для підмножини мови сценаріїв jаvascript (зокрема, Standard ECMA-262 3rd Edition-December) і зазвичай використовувався разом з ним. Однак це не залежить від мови формат даних. Код для розбору і генерації даних JSON доступний на багатьох мовах програмування. На веб-сайті JSON перераховані всі бібліотеки. Незважаючи на те, що JSON-формат online спочатку рекламувався і вважався суворим підмножиною jаvascript та ECMAScript, він періодично допускає деякі символи, не екрановані у рядках, які є неприпустимими в рядках jаvascript та ECMAScript.
Сам по собі JSON став міжнародним стандартом ECMA в 2013 році як стандарт ECMA-404 який в тому ж році використовувався в RFC 7158 в якості посилання. У 2014 році RFC 7159 став основною посиланням на використання JSON в Інтернеті (наприклад, MIME application/json).
Типи даних, синтаксис і приклад
Основними типами даних JSON є: Число: десяткове число зі знаком, яке може містити дробову частину і може використовувати експоненційну позначення E, але не може включати не-числа (наприклад, NaN). Формат не робить відмінностей між цілими і числами з плаваючою комою. jаvascript використовує формат подвійної точності із плаваючою комою для всіх своїх числових значень, але інші мови, що реалізують JSON, можуть кодувати їх по-різному.
Рядок: послідовність з нуля або великих символів Unicode. Рядки розділяються символами подвійних лапок і підтримують синтаксис зворотною косою рискою. Літерали: будь-яке із значень true або false. Масив: впорядкований список з нуля або більше значень, кожен з яких може бути будь-якого типу. Масиви використовують квадратні дужки з комами. Об'єкт: невпорядкований набір пар ім'я/значення, де імена (також звані ключами) є рядками. Оскільки об'єкти призначені для подання асоціативних масивів, рекомендується (хоча і не обов'язково), щоб кожен ключ був унікальним всередині нього. Об'єкти поділяють фігурними дужками і використовують коми для поділу кожної пари, у той час як всередині кожної з них символ двокрапки відокремлює ключ або ім'я від його значення. Null: Пусте значення, використовує слово null. Обмежені пробіли дозволені і можуть бути виставлені навколо або між синтаксичними елементами (значення і пунктуації, але не в межах значення рядка). Для цієї мети тільки чотири спеціальних символів вважаються пробілами: пробіл, горизонтальна вкладка, переклад рядка і коса риска. Зокрема, мітка байтового порядку не повинна генеруватися відповідної реалізацією (хоча вона може бути прийнята при синтаксичному аналізі JSON). Запит у форматі JSON не надає синтаксису для коментарів. Ранні версії (наприклад, зазначені в RFC 4627) вимагали, щоб дійсний документ складався тільки з об'єкта або типу масиву, який міг містити інші типи всередині них. Такий JSON-формат, приклад якого можна знайти на застарілих веб-сторінках, в даний час не використовується.
Проблеми з перенесенням даних
Незважаючи на те, що Дуглас Крокфорд спочатку стверджував, що JSON є строгим підмножиною jаvascript, його специфікація фактично дозволяє створювати документи, читані в jаvascript. Зокрема, JSON допускає, щоб значення рядків Unicode U + 2028 LINE SEPARATOR і U + 2029 PARAGRAPH SEPARATOR виглядали неэкранированными в цитованих рядках, а jаvascript - ні. Це є наслідком того, що JSON забороняє тільки «керуючі символи». Для максимальної сумісності ці символи повинні бути екрановані з зворотною косою рискою. Ця тонкість важлива при створенні JSONP.
JSON-формат: чим відкрити?
Документи JSON можуть кодуватися в UTF-8 UTF-16 або UTF-32 кодування за замовчуванням - UTF-8. Ці стандарти підтримують повний набір символів Юнікоду", включаючи символи поза основною багатомовною площині (від U + 10000 до U + 10FFFF). Однак, якщо вони екрановані, ці символи повинні бути написані з використанням сурогатних пар UTF-16 - деталі, що пропускається деякими аналізаторами JSON-формат. Чим відкрити і як буде прочитаний такий файл? Числа в даному форматі є агностическими щодо їх подання у мовах програмування. Немає ніякої різниці між цілим числом і значенням з плаваючою комою: деякі реалізації можуть розглядати 42420 і 4.2 E + 1 як одне і те ж число, в той час як інші можуть не робити цього. Крім того, відсутні вимоги щодо таких питань, як переповнення, недостатність, втрата точності або округлення. Крім того, формат JSON нічого не говорить про обробці підписаних нулів, незалежно від того, є чи 0.0 відмінним від -0.0. Більшість реалізацій, що використовують стандарт IEEE 754 з плаваючою комою, включаючи jаvascript, зберігають знакові нулі, але не всі реалізації JSON можуть це робити.
Використання jаvascript
Оскільки формат JSON був отриманий з jаvascript і його синтаксис (в основному) є підмножиною мови, для аналізу даних JSON можна використовувати функцію jаvascripteval. Через проблеми з розбором термінаторів Unicode рядків, розглянутих в попередньому розділі, функція eval повинна виконати їх заміну. Це небезпечно, якщо рядок не перевірена належним чином. Замість цього для читання і запису JSON слід використовувати бібліотеку парсера JSON або його підтримку jаvascript. Правильно реалізований синтаксичний аналізатор приймає тільки дійсний формат JSON, опис якої є в системі, запобігаючи ненавмисне виконання потенційно шкідливого коду. З 2010 року в таких браузерах Firefox і Internet Explorer включена підтримка аналізу і вивантаження в JSON-формат.
Непідтримувані власні типи даних
Синтаксис jаvascript визначає кілька власних типів даних, які не включені в стандарт JSON: Карта, Встановити, Дата, Помилка, Регулярний вираз, Функція і деякі інші. Ці типи даних jаvascript повинні бути представлені деякими іншими форматами, при цьому обидві програми погоджують спосіб перетворення між типами. Сьогодні існують деякі стандарти defacto, наприклад, перетворення дати в рядок, але жоден з них не є загальновизнаним. Інші мови можуть мати різний набір власних типів, які повинні бути серіалізовать ретельно, щоб мати справу з цим типом перетворення.
Схема JSON
Схема служить для визначення структури даних JSON для перевірки, документування та управління взаємодією. Вона надає свого роду контракт на дані, необхідні додатком, та спосіб їх зміни. Схема заснована на концепціях з XML Schema (XSD), але є власною. Як і в XSD, використовуються ті ж засоби серіалізації/десеріалізації як для схеми, так і для даних. Schema - це інтернет-проект, який в даний час знаходиться в 5-й версії (випущеної 13 жовтня 2016 року). Існує кілька валідаторів, доступних для різних мов програмування, кожна з яких володіє різним рівнем відповідності. Стандартного розширення файлів немає, але деякі фахівці пропонують затвердити .schema.json.
Тип MIME
Офіційним типом MIME для тексту JSON є «application/json». Незважаючи на те що у більшості сучасних реалізацій прийнятий офіційний MIME-тип, багато додатків продовжують забезпечувати успадковану підтримку інших типів MIME. Багато постачальників послуг, браузери, сервери, веб-додатки, бібліотеки, фреймворки і API використовують, очікують або розпізнають тип MIME, вміст якого виглядає як «текст/json» або «текст/jаvascript». Відомі приклади включають в себе Google Search API, Yahoo!, Flickr, Facebook API, DojoToolkit 0.4 і так далі.
JSON-RPC
JSON-RPC - це протокол віддаленого виклику процедур (RPC), побудований на JSON, створений в якості заміни для XML-RPC або SOAP. Це простий протокол, який визначає тільки кілька типів даних і команд. Він дозволяє системі відправляти повідомлення (інформацію на сервер, який не вимагає відповіді) і кілька викликів на сервер, на які можна відповісти не по порядку.
AJAJ
Асинхронний jаvascript і JSON (або AJAJ) відносяться до тієї ж динамічної методології веб-сторінок, що і Ajax, але замість XML саме формат даних JSON є основним. AJAJ - це технологія веб-розробки, яка забезпечує можливість веб-сторінки запитувати нові дані після завантаження в браузер. Зазвичай він відображає їх з сервера у відповідь на дії користувача на цій сторінці. Наприклад, те, що користувач вводить у поле пошуку, клієнтський код потім відправляє на сервер, який відразу ж відповідає розкривним списком відповідних елементів бази даних.
Проблеми безпеки
Текст в JSON-форматі визначається як об'єкт серіалізації даних. Однак його дизайн, як нестроге підмножина мови сценаріїв jаvascript, створює декілька проблем безпеки. Вони зосереджені на використанні інтерпретатора "Яваскрипт" для динамічного виконання тексту JSON, як вбудованого jаvascript. Це піддає програму помилковим або зловмисних скриптам. Це серйозна проблема при роботі з даними, які видобуваються з Інтернету. Цей простий і популярний, але ризикований метод використовує сумісність з функцією jаvascripteval. Деякі розробники помилково вважають, що текст у форматі JSON також є синтаксично аналогічним jаvascript, хоча це тільки частково вірно. Тому вважається, що простий спосіб для jаvascript-програми аналізувати дані у форматі - використання вбудованої функції jаvascripteval, яка була розроблена для оцінки виразів "Яваскрипт". Замість використання специфічного парсера сам інтерпретатор, таким чином, використовується для виконання даних JSON, створюючи природні jаvascript-об'єкти. Однак цей метод є ризикованим, якщо є ймовірність, що дані JSON можуть містити довільний код "Яваскрипт", який потім буде виконаний так само. Якщо спочатку не будуть прийняті заходи для перевірки даних, метод eval схильний вразливостей безпеки, коли дані і вся середа jаvascript не знаходяться під контролем одного надійного джерела. Наприклад, якщо дані не перевірені, вони зазнають атак шкідливого коду jаvascript. Такі порушення також можуть створювати небезпеку крадіжки даних, підробки аутентифікації й інші потенційні зловживання даними і ресурсами. Таким чином, нова функція JSON.parse була розроблена як більш безпечна альтернатива eval. Вона спеціально призначена для обробки даних саме JSON, а не jаvascript. Спочатку вона була запланована для включення в четверте видання стандарту ECMAScript, але цього не сталося. Вона була вперше додано у п'яту версію і тепер підтримується основними браузерами.